为什么?

本文的标题,明显有一种提醒的口吻。

从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()时最好指定“缓存名”的更多相关文章

  1. CRM 报表导出excel时指定sheet名

    如图所示,设置PageName即可: 这样导出excel时,sheet的名就有了:

  2. C# 一次查询多表,填充DataSet并指定表名

    lhrhi 原文 NET 一次查询多表,填充DataSet并指定表名(DataSet指定DataTable名称的技巧) 现实中的场景,有时可能需要一次查询数据库中表张.在使用SqlDataAdapte ...

  3. [置顶] android网络通讯之HttpClient4不指定参数名发送Post

    在HttpClient4之前都是通过List<NameValuePair>键值对的形式来向服务器传递参数 ,在4.0版本中在加入了不指定参数名发送数据的形式,利用StringEntity来 ...

  4. Android-删除指定包名的App

    /** * check and delete the old package app if it exists. */ private void checkOldPackage() { String ...

  5. React Native 在用户网络故障时自动调取缓存

    App往往都有缓存功能,例如常见的新闻类应用,如果你关闭网络,你上次打开App加载的数据还在,只是不能加载新的数据了. 我的博客bougieblog.cn,欢迎前来尬聊. 集中处理请求 如果你fetc ...

  6. git提交时忽略指定文件

    git提交时忽略指定文件 我们在项目开发过程中经常用到git来管理自己的项目,使用git版本控制进行多人协作开发具有许多优势,这里就不一一阐述了,有兴趣的同学可以自己去查找资料进行系统的学习.而本篇文 ...

  7. Firefox每次刷新时自动清空缓存的设置方法

    当我们开发网页应用时候,为了保证每次看到的页面是最新的,需要在刷新页面时清除页面缓存. 如果每次都手动清除比较麻烦,好在多数浏览器都支持自动清除缓存的功能. IE下我们可以将缓存设置为"每次 ...

  8. 7z压缩文件时排除指定的文件

    分享一个7z压缩文件时排除指定文件类型的命令行,感觉很有用: 7z a -t7z d:\updateCRM.7z d:\updateCRM\*.* -r -x!*.log -x!*bak a:创建压缩 ...

  9. l来自wentao:项目加入缓存(redis),实时调试时用 -----可视化缓存,flushdb

    下文来自segmentfault,网站:一个交流网站:https://segmentfault.com/ 在做一个项目时如果加入缓存(例如redis),我如何进行实时调试呢? 缓存 高并发 架构 gz ...

随机推荐

  1. jQuery异步Deferred

    原文链接:http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html 普通 ...

  2. 使用git下载编译erlang

    git clone https://github.com/erlang/otp cd otp git tag git checkout -b OTP- OTP- ./otp_build all exp ...

  3. sublime text there are no packages available for installation 解决办法

    hosts  增加一行 : #50.116.33.29       sublime.wbond.net.

  4. css 在背景图上加渐变

    <html> <head> <title>我的第一个 HTML 页面</title> <style> .banner { width: %; ...

  5. canvas - 炫酷的3D星空

    1.国际惯例,先上效果 (⊙o⊙)… 效果图看上去效果并不很炫酷啊,直接戳 这里 看效果吧! 2代码部分 html: <canvas id="canvas" width=&q ...

  6. java 调试

    作为一名java开发程序员,或者有时候需要利用工具调试的时候,但是却感觉不会使用,其实只要记住四个键即可. 一般java开发工具使用的都是Eclipse或者MyEclipse,下面都有这几个键F5(进 ...

  7. [cogs1065]绿豆蛙的归宿

    1065. [Nescafe19] 绿豆蛙的归宿 [题目描述] 给出一个有向无环的连通图,起点为1终点为N,每条边都有一个长度.绿豆蛙从起点出发,走向终点.到达每一个顶点时,如果有K条离开该点的道路, ...

  8. TCP的拥塞控制 (二)

    TCP Reno TCP  Reno引入了ssthresh(Slow Start threshold)变量,作为TCP的Slow Start和Congestion Avoidance两个阶段的分界线. ...

  9. 【转】c# thread.join 理解

    转自:http://blog.csdn.net/lulu_jiang/article/details/6584251 线程Join()方法:让一个线程等待另一线程终结后再继续运行. private s ...

  10. 【CF528D】Fuzzy Search(FFT)

    [CF528D]Fuzzy Search(FFT) 题面 给定两个只含有\(A,T,G,C\)的\(DNA\)序列 定义一个字符\(c\)可以被匹配为:它对齐的字符,在距离\(K\)以内,存在一个字符 ...