ASP.NET MVC3關(guān)于生成純靜態(tài)后如何不再走路由直接訪問靜態(tài)頁面
問題描述:高訪問量類型的電子商務(wù)網(wǎng)站,需要將一些不是經(jīng)常變化的頁面生成靜態(tài)頁面,然后普通用戶就可以直接訪問這些靜態(tài)頁面而不用再訪問需要連接數(shù)據(jù)庫的動態(tài)頁面。那么ASP.NET MVC3中如何做到這一點(diǎn)呢?
要解決這個問題,我們需要先了解ASP.NET應(yīng)用程序的生命周期,先看下面作者整理的一張圖片:
從圖中我們可以清楚的看到:通用IIS訪問應(yīng)用程序時,每次的單個頁面URL訪問時,都會先經(jīng)過HttpApplication 管線處理請求,走過BeginRequest 事件之后才會去走路由訪問具體的Controller和Action,最后結(jié)束的時候會請求EndRequest事件。下面用一張圖來表示這個順序:
注意圖中標(biāo)示的紅色部分就是我們要實(shí)現(xiàn)的部分,實(shí)現(xiàn)如下:
1 新建MyHandler.cs
public class MyHandler:IHttpModule { public void Init(HttpApplication application) { application.BeginRequest += (new EventHandler(this.Application_BeginRequest)); application.EndRequest += (new EventHandler(this.Application_EndRequest)); } private void Application_BeginRequest(Object source, EventArgs e) { // Create HttpApplication and HttpContext objects to access // request and response properties. HttpApplication application = (HttpApplication)source; HttpContext context = application.Context; string filePath = context.Request.FilePath; string fileExtension = VirtualPathUtility.GetExtension(filePath); if (fileExtension.Equals(".html")) { context.Response.WriteFile(context.Server.MapPath(filePath));//直接走靜態(tài)頁面
//此處可以加入緩存,條件也可以根據(jù)需要來自己定義
context.Response.End(); } } private void Application_EndRequest(Object source, EventArgs e) { HttpApplication application = (HttpApplication)source; HttpContext context = application.Context; string filePath = context.Request.FilePath; string fileExtension = VirtualPathUtility.GetExtension(filePath); if (fileExtension.Equals(".html")) { context.Response.Write("<hr><h1><font color=red>" + "HelloWorldModule: End of Request</font></h1>"); } } public void Dispose() { } }
2. web.config中加入以下代碼,才會運(yùn)行自定義的管道處理類
1: <httpModules>
2: <add name="MvcTest.MyHandler" type="MvcTest.MyHandler"/>
3: </httpModules>
運(yùn)行一下自己的代碼,看看效果你就全明白了!
補(bǔ)充:根據(jù)@小尾魚的提示,如果直接在自己的項(xiàng)目文件下生產(chǎn)了和URL中一樣的目錄文件,比如訪問:yourdomin.com/product/1.html,你的項(xiàng)目文件夾下真的存在product/1.html這個路徑,那么IIS會直接去請求這個靜態(tài)頁面,如果項(xiàng)目中使用了自定義的管道處理程序,那么這個靜態(tài)頁仍然會走我們的自定義管道處理程序,我們可以在這里通過緩存來實(shí)現(xiàn)要不要重新成長靜態(tài)頁或刪除過期產(chǎn)品的靜態(tài)頁,如果不使用此方法,只能去寫執(zhí)行計劃,定時跑這些靜態(tài)文件了,修改Application_BeginRequest
1: private void Application_BeginRequest(Object source,
2: EventArgs e)
3: {
4: // Create HttpApplication and HttpContext objects to access
5: // request and response properties.
6: HttpApplication application = (HttpApplication)source;
7: HttpContext context = application.Context;
8: string filePath = context.Request.FilePath;
9: string fileExtension =
10: VirtualPathUtility.GetExtension(filePath);
11: if (fileExtension.Equals(".html"))
12: {
13: //判斷緩存是否存在,不存在加入緩存,調(diào)用生成靜態(tài)的類和方法
14: //產(chǎn)品過期,移除靜態(tài)文件,302重定向
15: if (System.IO.File.Exists(context.Server.MapPath(filePath)))
16: {
17: context.Response.WriteFile(context.Server.MapPath(filePath));
18: context.Response.End();
19: }
20:
21:
22: }


浙公網(wǎng)安備 33010602011771號