Razor使用Parse()时最好指定“缓存名”
为什么?
本文的标题,明显有一种提醒的口吻。
从18年的生活经验看,如果想提醒人要怎么办,不要怎么办。
最好说明原因。那么小编开始说明原因喽。
哦对,说原因之前,先说交代一下背景,一句话 在非mvc下使用Razor模板引擎。(end)
仍然是这个流程图,我们知道Razor模板引擎,在工作的时候是生成C#代码执行,生成程序集,再调用程序集生成html。
也就是说如果没有意外的话,每次请求,都会生成一个程序集。(会反复执行图中黄圈里的代码。)
而我们知道这些生成程序集是非常耗时的,而且多个程序集会占用资源。
这就是小编强调要的指定缓存名的原因。那么我们接下来看看如何使用“缓存”。
其实说起来复杂,做起来很容易!
如何使用
1.指定缓存名会变得快一些
这样一段代码。
string cshtml =File.ReadAllText("路径");
for(int i =0;i<500;i++)
{
// 在这个例子中,会形成500个随机命名的程序集
string html1 = Razor.Parse(cshtml);
//在这个例子中,解析cshtml文件,同时给了一个“缓存名”。
//这次一旦编译成功,下次Parse()就不再重复编译。直到cshtml文件被修改。
string html2 = Razor.Parse(cshtml,null,"cccc");//"cccc"是随意起的名字。
}
刚刚说的“缓存名”可能有点含糊,我也不知道怎么叫这个东西。就是上文例子中的
“cccc”,给了这个参数后,以后的相同请求就不再重新随机命名的去创建了。
2.指定什么名合适?
我这个例子中的做法是【cshtml文件全路径】+【文件上次修改时间】的一种策略。
当然也可以用文件的md5啊什么的。
我的理解是,只要能唯一识别一个cshtml文件即可。(当然,不止同名。文件修改前和文件修改后不算同一个文件。)
string fullpath ="全路径";
string cshtml = File.ReadAllText(fullpath);
//“缓存名” =【cshtml文件全路径】+【文件上次修改时间】
string cacheName = fullpath + File.GetLastWriteTime(fullpath);
Razor.Parse(cshtml,null,cacheName);
3.封装一个RazorHelper
基于以上 1、2的观点(1.指定"缓存名" 2.“缓存名“=【cshtml文件全路径】+【文件上次修改时间】)
本文讨论的问题已然解决,但是经过1、2操作以后,多出来好多代码,而且这些代码是可以复用的。
所以呢,封装一个RazorHelper把1.2.对应的代码扔到一个方法里去。
public class RazorHelper
{
//直接敲的,没VS就不写文档注释了。
public static string Parse(HttpContext context,
string cshtmlVirtualPath,Object model)
{
string fullpath = context.Server.MapPath(cshtmlVirtualPath);
string cshtml = File.ReadAllText(fullpath);
string cacheName = fullpath+File.GetLastWriteTime(fullpath);
string html =Razor.Parse(cshtml,model,cacheName);
return html;
}
}
当然RazorHelper只有这么一个方法的话,有点逗B。。。
接下来的几篇文章里,我会逐步让他丰富起来。
Razor使用Parse()时最好指定“缓存名”的更多相关文章
- CRM 报表导出excel时指定sheet名
如图所示,设置PageName即可: 这样导出excel时,sheet的名就有了:
- C# 一次查询多表,填充DataSet并指定表名
lhrhi 原文 NET 一次查询多表,填充DataSet并指定表名(DataSet指定DataTable名称的技巧) 现实中的场景,有时可能需要一次查询数据库中表张.在使用SqlDataAdapte ...
- [置顶] android网络通讯之HttpClient4不指定参数名发送Post
在HttpClient4之前都是通过List<NameValuePair>键值对的形式来向服务器传递参数 ,在4.0版本中在加入了不指定参数名发送数据的形式,利用StringEntity来 ...
- Android-删除指定包名的App
/** * check and delete the old package app if it exists. */ private void checkOldPackage() { String ...
- React Native 在用户网络故障时自动调取缓存
App往往都有缓存功能,例如常见的新闻类应用,如果你关闭网络,你上次打开App加载的数据还在,只是不能加载新的数据了. 我的博客bougieblog.cn,欢迎前来尬聊. 集中处理请求 如果你fetc ...
- git提交时忽略指定文件
git提交时忽略指定文件 我们在项目开发过程中经常用到git来管理自己的项目,使用git版本控制进行多人协作开发具有许多优势,这里就不一一阐述了,有兴趣的同学可以自己去查找资料进行系统的学习.而本篇文 ...
- Firefox每次刷新时自动清空缓存的设置方法
当我们开发网页应用时候,为了保证每次看到的页面是最新的,需要在刷新页面时清除页面缓存. 如果每次都手动清除比较麻烦,好在多数浏览器都支持自动清除缓存的功能. IE下我们可以将缓存设置为"每次 ...
- 7z压缩文件时排除指定的文件
分享一个7z压缩文件时排除指定文件类型的命令行,感觉很有用: 7z a -t7z d:\updateCRM.7z d:\updateCRM\*.* -r -x!*.log -x!*bak a:创建压缩 ...
- l来自wentao:项目加入缓存(redis),实时调试时用 -----可视化缓存,flushdb
下文来自segmentfault,网站:一个交流网站:https://segmentfault.com/ 在做一个项目时如果加入缓存(例如redis),我如何进行实时调试呢? 缓存 高并发 架构 gz ...
随机推荐
- 1st 四人小组项目
小组名称:好好学习 项目组长:林莉 组员:王东涵.宫丽君.胡丽娜 项目选题:基于jsp的车库管理系统 项目期限:十周内<暂定> 需求分析:有待进一步思考
- oracle 查询优化及sql改写
ORACLE有个高速缓冲的概念,这个高速缓冲就是存放执行过的SQL语句,那oracle在执行sql语句的时候要做很多工作,例如解析sql语句,估算索引利用率,绑定变量,读取数据块等等这些操作.假设高速 ...
- BZOJ 1264 基因匹配(DP+线段树)
很有意思的一道题啊. 求两个序列的最大公共子序列.保证每个序列中含有1-n各5个. 如果直接LCS显然是TLE的.该题与普通的LCS不同的是每个序列中含有1-n各5个. 考虑LCS的经典DP方程.dp ...
- bzoj5090[lydsy11月赛]组题
裸的01分数规划,二分答案,没了. #include<cstdio> #include<algorithm> using namespace std; const int ma ...
- Docker学习笔记二:Docker常用命令及提升拉取镜像的速度
一.Docker命令: 1.docker images //命令用来查看docker中所包含的镜像信息 2.docker ps -a //命令用来查看docker中所包含所有容器信息(运行状 ...
- 【ZOJ3316】Game(带花树)
[ZOJ3316]Game(带花树) 题面 Vjudge 翻译: 给定棋盘上\(n\)个旗子 一开始先手可以随便拿, 然后每次都不能取离上次的曼哈顿距离超过\(L\)的旗子 谁不能动谁输. 问后手能否 ...
- 洛谷P4559 [JSOI2018]列队 【70分二分 + 主席树】
题目链接 洛谷P4559 题解 只会做\(70\)分的\(O(nlog^2n)\) 如果本来就在区间内的人是不用动的,区间右边的人往区间最右的那些空位跑,区间左边的人往区间最左的那些空位跑 找到这些空 ...
- linux安全第二周学习总结
一.实验过程 cd LinuxKernel/linux-3.9.4 qemu -kernel arch/x86/boot/bzImage 然后cd mykernel 您可以看到qemu窗口输出的内容的 ...
- Linux内核分析6
周子轩 原创作品 转载请注明出处 <Linux内核分析>MOOC课程:http://mooc.study.163.com/course/USTC-1000029000 一.视频笔记 1. ...
- 函数式编程(1)-高阶变成(2)-filter
filter Python内建的filter()函数用于过滤序列. 和map()类似,filter()也接收一个函数和一个序列.和map()不同的时,filter()把传入的函数依次作用于每个元素,然 ...