本文的標題,明顯有一種提醒的口吻。
從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。。。
接下來的幾篇文章里,我會逐步讓他豐富起來。
新聞熱點
疑難解答