本文主要介紹HttpModule,它在一個網頁請求過程中是一個怎樣的過程是我們要知道的,在網頁加載過程中HttpModule在何時被執行也是我們要知道的,以及,HttpModule在網頁請求過程中,所被觸發的各個事件也是我們要知道的,下面就帶著問題來看文章吧
ASP.NET對請求處理的過程
當請求一個*.aspx文件的時候,這個請求會被inetinfo.exe進程截獲,它判斷文件的后綴(aspx)之后,將這個請求轉交給 ASPNET_ISAPI.dll(否則交給對應的應用程序去解釋它),ASPNET_ISAPI.dll會通過http管道(Http PipeLine)將請求發送給ASPNET_WP.exe進程,在ASPNET_WP.exe進程中通過HttpRuntime來處理這個請求,處理完 畢將結果返回客戶端。
下面看一個各個術語的含義
inetinfo.exe進程:是www服務的進程,IIS服務和ASPNET_ISAPI.DLL都寄存在此進程中。
ASPNET_ISAPI.DLL:是處理.aspx文件的win32組件。其實IIS服務器是只能識別.html文件的,當IIS服務器發現被請求的文件是.aspx文件時,IIS服務器將其交給aspnet_isapi.dll來處理。
aspnet_wp.exe進程:ASP.NET框架進程,提供.net運行的托管環境,.net的CLR(公共語言運行時)就是寄存在此進程中。
aspnet_wp處理一個Http Request的流程
HttpRequest-->
inetinfo.exe-->
ASPNET_ISAPI.dll-->
ASPNET_WP.exe-->
HttpRuntime-->
HttpApplication Factory-->
HttpApplication-->
HttpModule-->
HttpHandler Factory-->
HttpHandler-->
HttpHandler.ProcessRequest()
通過上面的流程中,我們可以看到HttpModel在何時被執行的。
ASP.NET請求處理過程是基于管道模型的,這個管道模型是由多個HttpModule和HttpHandler組成,ASP.NET
把http請求依次傳遞給管道中各個HttpModule,最終被HttpHandler處理,處理完成后,再次經過管道中的HTTP模塊,把結果返回給
客戶端。我們可以在每個HttpModule中都可以干預請求的處理過程。
注意:在http請求的處理過程中,只能調用一個HttpHandler,但可以調用多個HttpModule
HttpModule會注冊以下事件
AcquireRequestState 當ASP.NET運行時準備好接收當前HTTP請求的對話狀態的時候引發這個事件。
AuthenticateRequest 當ASP.NET 運行時準備驗證用戶身份的時候引發這個事件。
AuthorizeRequest 當ASP.NET運行時準備授權用戶訪問資源的時候引發這個事件。
BeginRequest 當ASP.NET運行時接收到新的HTTP請求的時候引發這個事件。
Disposed 當ASP.NET完成HTTP請求的處理過程時引發這個事件。
EndRequest 把響應內容發送到客戶端之前引發這個事件。
Error 在處理HTTP請求的過程中出現未處理異常的時候引發這個事件。
PostRequestHandlerExecute 在HTTP處理程序結束執行的時候引發這個事件。
PreRequestHandlerExecute 在ASP.NET開始執行HTTP請求的處理程序之前引發這個事件。在這個事件之后,ASP.NET 把該請求轉發給適當的HTTP處理程序。
PreSendRequestContent 在ASP.NET把響應內容發送到客戶端之前引發這個事件。這個事件允許我們在內容到達客戶端之前改變響應內容。我們可以使用這個事件給頁面輸出添加用于所有頁面的內容。例如通用菜單、頭信息或腳信息。
PreSendRequestHeaders 在ASP.NET把HTTP響應頭信息發送給客戶端之前引發這個事件。在頭信息到達客戶端之前,這個事件允許我們改變它的內容。我們可以使用這個事件在頭信息中添加cookie和自定義數據。
ReleaseRequestState 當ASP.NET結束所搜有的請求處理程序執行的時候引發這個事件。
ResolveRequestCache 我們引發這個事件來決定是否可以使用從輸出緩沖返回的內容來結束請求。這依賴于Web應用程序的輸出緩沖時怎樣設置的。
UpdateRequestCache 當ASP.NET完成了當前的HTTP請求的處理,并且輸出內容已經準備好添加給輸出緩沖的時候,引發這個事件。這依賴于Web應用程序的輸出緩沖是如何設置的。
好了,有了上面的基礎知識之后,相信各位對HttpModule有了一個全新的認識了吧。
文章列表