天天看點

mvc生成靜态html頁面,ASP.NET MVC3關于生成純靜态後如何不再走路由直接通路靜态頁面..." +

要解決這個問題,我們需要先了解ASP.NET應用程式的生命周期,先看下面作者整理的一張圖檔:

mvc生成靜态html頁面,ASP.NET MVC3關于生成純靜态後如何不再走路由直接通路靜态頁面..." +

從圖中我們可以清楚的看到:通用IIS通路應用程式時,每次的單個頁面URL通路時,都會先經過HttpApplication 管線處理請求,走過BeginRequest 事件之後才會去走路由通路具體的Controller和Action,最後結束的時候會請求EndRequest事件。下面用一張圖來表示這個順序:

mvc生成靜态html頁面,ASP.NET MVC3關于生成純靜态後如何不再走路由直接通路靜态頁面..." +

注意圖中标示的紅色部分就是我們要實作的部分,實作如下:

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));//直接走靜态頁面

//此處可以加入緩存,條件也可以根據需要來自己定義

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("

" +

"HelloWorldModule: End of Request

");

}

}

public void Dispose() { }

}

2. web.config中加入以下代碼,才會運作自定義的管道處理類

運作一下自己的代碼,看看效果你就全明白了!

補充:根據@小尾魚的提示,如果直接在自己的項目檔案下生産了和URL中一樣的目錄檔案,比如通路:yourdomin.com/product/1.html,你的項目檔案夾下真的存在product/1.html這個路徑,那麼IIS會直接去請求這個靜态頁面,如果項目中使用了自定義的管道處理程式,那麼這個靜态頁仍然會走我們的自定義管道處理程式,我們可以在這裡通過緩存來實作要不要重新成長靜态頁或删除過期産品的靜态頁,如果不使用此方法,隻能去寫執行計劃,定時跑這些靜态檔案了,修改Application_BeginRequest

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"))

{

//判斷緩存是否存在,不存在加入緩存,調用生成靜态的類和方法

//産品過期,移除靜态檔案,302重定向

if (System.IO.File.Exists(context.Server.MapPath(filePath)))

{

context.Response.WriteFile(context.Server.MapPath(filePath));

context.Response.End();

}

}

思路大體如此。