ASP.NET MVC3關(guān)于生成純靜態(tài)后如何不再走路由直接訪問靜態(tài)頁面
要解決這個問題,我們需要先了解ASP.NET應(yīng)用程序的生命周期,先看下面作者整理的一張圖片:
從圖中我們可以清楚的看到:通用IIS訪問應(yīng)用程序時,每次的單個頁面URL訪問時,都會先經(jīng)過HttpApplication 管線處理請求,走過BeginRequest 事件之后才會去走路由訪問具體的Controller和Action,最后結(jié)束的時候會請求EndRequest事件。下面用一張圖來表示這個順序:
注意圖中標(biāo)示的紅色部分就是我們要實現(xiàn)的部分,實現(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中加入以下代碼,才會運行自定義的管道處理類
<httpModules>
<add name="MvcTest.MyHandler" type="MvcTest.MyHandler"/>
</httpModules>
運行一下自己的代碼,看看效果你就全明白了!
補(bǔ)充:根據(jù)@小尾魚的提示,如果直接在自己的項目文件下生產(chǎn)了和URL中一樣的目錄文件,比如訪問:yourdomin.com/product/1.html,你的項目文件夾下真的存在product/1.html這個路徑,那么IIS會直接去請求這個靜態(tài)頁面,如果項目中使用了自定義的管道處理程序,那么這個靜態(tài)頁仍然會走我們的自定義管道處理程序,我們可以在這里通過緩存來實現(xiàn)要不要重新成長靜態(tài)頁或刪除過期產(chǎn)品的靜態(tài)頁,如果不使用此方法,只能去寫執(zhí)行計劃,定時跑這些靜態(tài)文件了,修改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"))
{
//判斷緩存是否存在,不存在加入緩存,調(diào)用生成靜態(tài)的類和方法
//產(chǎn)品過期,移除靜態(tài)文件,302重定向
if (System.IO.File.Exists(context.Server.MapPath(filePath)))
{
context.Response.WriteFile(context.Server.MapPath(filePath));
context.Response.End();
}
}
思路大體如此。
相關(guān)文章
asp.net下Repeater使用 AspNetPager分頁控件
AspNetPager針對ASP.NET分頁控件的不足,提出了與眾不同的解決asp.net中分頁問題的方案2010-03-03.NET Core使用EF生成數(shù)據(jù)庫出錯的解決方法
這篇文章介紹了.NET Core使用EF生成數(shù)據(jù)庫出錯的解決方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-01-01詳解在ASP.NET Core中使用Angular2以及與Angular2的Token base身份認(rèn)證
這篇文章主要介紹了詳解在ASP.NET Core中使用Angular2以及與Angular2的Token base身份認(rèn)證,有興趣的可以了解一下。2016-12-12利用FastReport傳遞圖片參數(shù)在報表上展示簽名信息的實現(xiàn)方法
這篇文章主要介紹了利用FastReport傳遞圖片參數(shù)在報表上展示簽名信息,其中主要注意的是,我們傳遞的圖片數(shù)據(jù)需要采用Base64String的格式才能正常傳遞和展示,本文通過圖文實例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10ASP.NET Core中預(yù)壓縮靜態(tài)文件的方法步驟
這篇文章主要給大家介紹了關(guān)于ASP.NET Core中如何預(yù)壓縮靜態(tài)文件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用ASP.NET Core具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03asp.net中js+jquery添加下拉框值和后臺獲取示例
這篇文章主要介紹了asp.net中js+jquery添加下拉框值和后臺獲取的具體實現(xiàn),需要的朋友可以參考下2014-05-05.net客戶端導(dǎo)出Excel實現(xiàn)代碼及注意事項
將DataGrid導(dǎo)出為Excel文件及導(dǎo)出dgData中0-3列的數(shù)據(jù)到excel文件中的優(yōu)缺點介紹,感興趣的朋友可以了解下,希望本文對你有所幫助2013-02-02ashx介紹以及ashx文件與aspx文件之間的區(qū)別
這篇文章主要介紹了ashx以及ashx文件與aspx文件之間的區(qū)別。需要的朋友可以過來參考下,希望對大家有所幫助2013-12-12