ASP.NET MVC3關於產生純靜態後如何不再走路由直接存取靜態頁面

來源:互聯網
上載者:User

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

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

注意圖中標示的紅色部分就是我們要實現的部分,實現如下:
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("<hr><h1><font color=red>" +
"HelloWorldModule: End of Request</font></h1>");
}
}
public void Dispose() { }
}

2. web.config中加入以下代碼,才會運行自訂的管道處理類
複製代碼 代碼如下:<httpModules>
<add name="MvcTest.MyHandler" type="MvcTest.MyHandler"/>
</httpModules>

運行一下自己的代碼,看看效果你就全明白了!
補充:根據@小尾魚的提示,如果直接在自己的專案檔下生產了和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();
}
}

思路大體如此。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.