開發人員應該對IIS理論層的知識瞭解的多一些~第四講 HttpModule中的幾大事件

張佔嶺發表於2014-10-09

返回目錄

本文主要介紹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有了一個全新的認識了吧。

返回目錄

相關文章