.net httpHandler和httpModule
今天無意中又想起了HttpHandler,又想到很久沒看這東東了,貌似應該再複習複習.網上轉一貼,Mark下...
HttpModule是向實現類提供模組初始化和處置事件。當一個HTTP請求到達HttpModule時,整個ASP.NET Framework系統還並沒有對這個HTTP請求做任何處理,也就是說此時對於HTTP請求來講,HttpModule是一個HTTP請求的“必經之路”,所以可以在這個HTTP請求傳遞到真正的請求處理中心(HttpHandler)之前附加一些需要的資訊在這個HTTP請求資訊之上,或者針對截獲的這個HTTP請求資訊作一些額外的工作,或者在某些情況下乾脆終止滿足一些條件的HTTP請求,從而可以起到一個Filter過濾器的作用。
說明:
(1)、客戶端瀏覽器向伺服器發出一個http請求,此請求會被inetinfo.exe程式截獲,然後轉交給aspnet_isapi.dll程式,接著它又通過Http Pipeline的管道,傳送給aspnet_wp.exe這個程式,接下來就到了.net framework的HttpRunTime處理中心,處理完畢後就傳送給使用者瀏覽器。
(2)、當一個http請求被送入到HttpRuntime之後,這個Http請求會繼續被送入到一個被稱之為HttpApplication Factory的一個容器當中,而這個容器會給出一個HttpApplication例項來處理傳遞進來的http請求,而後這個Http請求會依次進入到如下幾個容器中:HttpModule --> HttpHandler Factory --> HttpHandler。當系統內部的HttpHandler的ProcessRequest方法處理完畢之後,整個Http
Request就被處理完成了,客戶端也就得到相應的東東了。
(3)完整的http請求在asp.net framework中的處理流程:
HttpRequest-->inetinfo.exe->ASPNET_ISAPI.DLL-->Http Pipeline-->ASPNET_WP.EXE-->HttpRuntime-->HttpApplication Factory-->HttpApplication-->HttpModule-->HttpHandler Factory-->HttpHandler-->HttpHandler.ProcessRequest()
也就是說一個HTTP請求在HttpModule容器的傳遞過程中,會在某一時刻(ResolveRequestCache事件)將這個HTTP請求傳遞給HttpHandler容器。在這個事件之後,HttpModule容器會建立一個HttpHandler的入口例項,但是此時並沒有將HTTP請求控制權交出,而是繼續觸發AcquireRequestState事件以及PreRequestHandlerExcute事件。在PreRequestHandlerExcute事件之後,HttpModule視窗就會將控制權暫時交給HttpHandler容器,以便進行真正的HTTP請求處理工作。
而在HttpHandler容器內部會執行ProcessRequest方法來處理HTTP請求。在容器HttpHandler處理完畢整個HTTP請求之後,會將控制權交還給HttpModule,HttpModule則會繼續對處理完畢的HTTP請求資訊流進行層層的轉交動作,直到返回到客戶端為止。
PS:紅色的HttpApplication例項在HttpModule的Init方法中會用到。
(4)如果想在中途截獲一個httpRequest並做些自己的處理,就應該在HttpRuntime執行時內部來做到這一點,確切的說是在HttpModule這個容器中來實現。
2、HttpModule工作原理
負責監聽HttpRequest,同時對HttpRequest增添或者過濾掉一部分內容。也就是說,當一個HTTP請求到達HttpModule時,整個ASP.NET Framework系統還並沒有對這個HTTP請求做任何處理,也就是說此時對於HTTP請求來講,HttpModule是一個HTTP請求的“必經之路”,所以可以在這個HTTP請求傳遞到真正的請求處理中心(HttpHandler)之前附加一些需要的資訊在這個HTTP請求資訊之上,或者針對截獲的這個HTTP請求資訊作一些額外的工作,或者在某些情況下乾脆終止滿足一些條件的HTTP請求,從而可以起到一個Filter過濾器的作用。
HttpModule實現了介面IHttpModule,我們可以自定義實現該介面的類,從而取代HttpModule。
asp.net預設的HttpModule如下:
3、編寫自己的HttpModule
要實現HttpModule,必須實現介面IHttpModule。下面是IHttpModule介面分析:
using System; namespace System.Web{ publicinterface IHttpModule { // 銷燬不再被HttpModule使用的資源void Dispose(); // 初始化一個Module,為捕獲HttpRequest做準備void Init(HttpApplication context); }}
下面是自己的HttpModule:
using System; using System.Web; namespace ClassLibrary1{ publicclass MyHttpModule : IHttpModule { public void Dispose() { } publicvoid Init(HttpApplication context) { context.BeginRequest += new EventHandler(Application_BeginRequest); context.EndRequest += new EventHandler(Application_EndRequest); } publicvoid Application_BeginRequest(object sender, EventArgs e) { HttpApplication application = sender as HttpApplication; HttpContext context = application.Context; HttpResponse response = context.Response; response.Write("這是來自自定義HttpModule中有BeginRequest"); } public void Application_EndRequest(object sender, EventArgs e) { HttpApplication application = sender as HttpApplication; HttpContext context = application.Context; HttpResponse response = context.Response; response.Write("這是來自自定義HttpModule中有EndRequest"); } } }
web.config
default.aspx.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Response.Write("<br/><br/>來自Default.aspx頁面<br/>"); }}4、HttpModule內部事件機制和生命週期
HttpModule對HttpApplication例項進行處理,而HttpApplication有很多事件(對應不同的生命期),這樣就衍生出HttpModule內部事件機制和生命週期。
(1)、HttpModule的事件
說明:
a、BenginRequest和EndRequest分別是HttpModule容器最開始的和最後的事件;
b、EndRequest之後還會觸發PreSendRequestHeaders事件和PreSendRequestContent事件,這不是在HttpModule外的兩個事件,表示HttpModule結束,即將開始向Client傳送資料。
(2)、驗證HttpModule生命週期
與HttpHandler的互動:
a、HttpModule容器會將HttpRequest傳遞到HttpHandler容器,這個時間點是ResolveRequestCache事件
b、HttpModule容器會建立HttpHandler例項作為入口——Session從此生效
c、觸發AcquireRequestState事件以及PreRequestHandlerExecute事件
d、HttpModule容器便將對HttpRequest的控制權轉讓給HttpHandler容器
e、HttpHandler容器處理HttpRequest——使用自身的ProcessRequest方法,將對其控制權又還給HttpModule容器——之後Session失效。
<add name="HttpModule1" type="MyHttpModule.HttpModule1,MyHttpModule"/> <add name="HttpModule2" type="MyHttpModule.HttpModule2,MyHttpModule"/>
HttpModule1和HttpModule2模仿ValidaterHttpModuleEvents編寫(除了類名改變外,事件和方法不變),不貼程式碼了。執行結果如下:
相關文章
- ASP.NET三劍客 HttpApplication HttpModule HttpHandler 解析ASP.NETHTTPAPP
- HttpModule與HttpHandler的區別(一)HTTP
- ASP.NET HttpModule——原理ASP.NETHTTP
- 一個基於jQuery ajax和.net httphandler 的超輕非同步框架jQueryHTTP非同步框架
- 【包建強】ASP.NET底層機制 HttpHandlerASP.NETHTTP
- Asp.Net 中使用HttpModule 做Session驗證ASP.NETHTTPSession
- Asp.Net 構架(HttpModule 介紹) - Part.3ASP.NETHTTP
- ASP.NET Core中介軟體與HttpModule有何不同ASP.NETHTTP
- HttpApplication,HttpModule,HttpContext及Asp.Net頁生命週期HTTPAPPContextASP.NET
- HttpModule的認識HTTP
- ASP.NET利用HttpHandler實現多副檔名檔案下載ASP.NETHTTP
- ASP.NET使用HttpModule壓縮並刪除空白Html請求ASP.NETHTTPHTML
- Asp.net下使用HttpModule模擬Filter,實現許可權控制ASP.NETHTTPFilter
- HttpHandler給本站加圖片水印HTTP
- Spring WebFlux之HttpHandler的探索SpringWebUXHTTP
- HttpHandler應用之 - 防止圖片盜鏈HTTP
- Angular 4.x HttpModule 揭祕AngularHTTP
- 使用HttpModule實現URL重寫HTTP
- 在 HttpHandler 中使用 Session 的注意事項HTTPSession
- Mvc動態註冊HttpModule詳解MVCHTTP
- HttpModule的認識與深入理解HTTP
- Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'HTTP
- HttpModule學習總結例項應用-讀書筆記HTTP筆記
- MVC之前的那點事兒系列(6):動態註冊HttpModuleMVCHTTP
- HttpHandler的一個應用,aspx站點偽裝為php站點薦HTTPPHP
- .NET Framework 4 和 .NET Framework 4 Client ProfileFrameworkclient
- 使用.NET MVC和BootstrapMVCboot
- netty系列之:NIO和netty詳解Netty
- NETCA和NETMGR工具的區別
- 利用HttpModule 檢查使用者是否有許可權開啟指定的網址HTTP
- .NET科普:.NET簡史、.NET Standard以及C#和.NET Framework之間的關係C#Framework
- .NET平臺系列23:.NET Core/.NET5/.NET6 和 .NET Framework 的選擇建議Framework
- AFNetworking和YTKNetwork的快取策略快取
- dotNET和VS.NET 學習錄影 (轉)
- 使用 Phalanger 整合 PHP 和 .NetPHP
- 我和Netty的故事Netty
- php和.net 的加密解密PHP加密解密
- ASP.NET MVC和AJAXASP.NETMVC