HttpModule的認識與深入理解

作者: FengLang  來源: 博客園  發布時間: 2009-10-22 10:26  閱讀: 2166 次  推薦: 1   原文鏈接   [收藏]  

  HttpModule是向實現類提供模塊初始化和處置事件。當一個HTTP請求到達HttpModule時,整個ASP.NET Framework系統還并沒有對這個HTTP請求做任何處理,也就是說此時對于HTTP請求來講,HttpModule是一個HTTP請求的“必經之路”,所以可以在這個HTTP請求傳遞到真正的請求處理中心(HttpHandler)之前附加一些需要的信息在這個HTTP請求信息之上,或者針對截獲的這個HTTP請求信息作一些額外的工作,或者在某些情況下干脆終止滿足一些條件的HTTP請求,從而可以起到一個Filter過濾器的作用。

  首先你要實現IHttpModule接口這個接口只有兩個方法,一個是Init方法一個Dispose方法.

Code

 

  一個HTTP請求在HttpModule容器的傳遞過程中,會在某一時刻(ResolveRequestCache事件)將這個HTTP請求傳遞給HttpHandler容器。在這個事件之后,HttpModule容器會建立一個HttpHandler的入口實例,但是此時并沒有將HTTP請求控制權交出,而是繼續觸發AcquireRequestState事件以及PreRequestHandlerExcute事件。在PreRequestHandlerExcute事件之后,HttpModule窗口就會將控制權暫時交給HttpHandler容器,以便進行真正的HTTP請求處理工作。

  而在HttpHandler容器內部會執行ProcessRequest方法來處理HTTP請求。在容器HttpHandler處理完畢整個HTTP請求之后,會將控制權交還給HttpModule,HttpModule則會繼續對處理完畢的HTTP請求信息流進行層層的轉交動作,直到返回到客戶端為止。

  HttpModule過程在下面的事件:
    1.BeginRequest    指示請求處理開始。
    2.AuthenticateRequest PostAuthenticateRequest    封裝請求身份驗證過程。
    3.AuthorizeRequest   PostAuthorizeRequest    封裝請求授權過程。 
    4.ResolveRequestCache PostResolveRequestCache    封裝檢查是否能利用以前緩存的輸出頁面處理請求的過程。
    5.PostMapRequestHandler    指示已發現用于處理請求的 HTTP 處理程序。
    6.AcquireRequestState    PostAcquireRequestState    封裝對請求會話狀態的檢索。
    7.PostRequestHandlerExecute    指示用于處理請求的 HTTP 處理程序已執行。
    8.ReleaseRequestState   PostReleaseRequestState    封裝對請求會話狀態的發布。
    9.UpdateRequestCache    PostUpdateRequestCache    封裝檢查是否應對請求的資源的輸出進行緩存以備今后重復使用的過程。
    10.EndRequest    指示請求處理結束。

  可以利用HttpModule通過調用HttpApplication.CompleteRequest()方法實現當滿足某一個條件時終止此次的HTTP請求。需要注意的是,即使調用了HttpApplication.CompleteRequest()方法終止了一個HTTP請求,ASP.NET Framework仍然會觸發HttpApplication后面的這3個事件:EndRequest事件、PreSendRequestHeaders事件、PreSendRequestContent事件。

  如果存在多個自定義的HttpModule的話,當Module1終止了一個HTTP請求,這個HTTP請求將不會再觸發Module2中相應的事件了,但Module2的最后三個事件仍會被觸發。

Code


HttpModule示例:

 過濾http請求

Code

在web.confg中添加httpModules節點注冊事件

判斷瀏覽器的版本 

Code

注冊web.config事件

實現URL重寫

Code

 

 注冊web.config事件

-------------------------------------------------完成------------------------------------------------

從上面的例子看出,其實是一個好簡單的實現方法,就是在init中注冊處理過程事件,把代碼寫完后,在web.congif中HttpModules注冊就完成了.

開發程序千變萬變, 通過這一方法可以編寫出好多合適自己用的功能,這需要大家去實踐了. 收集與整理,且當成長的回憶.

1
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()