天天看點

HttpHandler與HttpModule的用處與差別 一、HttpHandler 二、HttpModule 三、總結

出處:http://www.cnblogs.com/JimmyZhang/archive/2007/09/15/894124.html

     問題1:什麼是HttpHandler?

  問題2:什麼是HttpModule?

  問題3:什麼時候應該使用HttpHandler什麼時候使用HttpModule?

  答案1:HttpHandler,Http請求的處理者,例如ScriptHandler、WebServiceHandler,IHttpHandler的實作都是為了處理某一類具體資源的請求。

  答案2:HttpModule,Http子產品。實際上就是那19個标準事件的處理者,比如OutputCacheModule,SessionStateModule。

一、HttpHandler

  應該還記得我們提到過 ISAPI,它根據檔案名字尾把不同的請求轉交給不同的處理程式。但是仔細看看就會發現:幾乎一大半的檔案都交給 aspnet_isapi.dll 去處理了。很明顯,aspnet_isapi.dll 不可能對每種檔案采用同一種方式處理,那麼 aspnet_isapi.dll 是如何更進一步處理不同的檔案,交由誰去處理呢?為了搞清楚這個問題,我們需要打開機器上C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\ 目錄下的web.config 檔案。

1 2 3 4 5 6 7 8 9 10 11

<httpHandlers>

... ... 

//略

<add path=

"*.axd"

verb=

"*"

type=

"System.Web.HttpNotFoundHandler"

validate=

"True"

/><add path=

"*.aspx"

verb=

"*"

type=

"System.Web.UI.PageHandlerFactory"

validate=

"True"

/>

<add path=

"*.ashx"

verb=

"*"

type=

"System.Web.UI.SimpleHandlerFactory"

validate=

"True"

/>

<add path=

"*.asax"

verb=

"*"

type=

"System.Web.HttpForbiddenHandler"

validate=

"True"

/>

<add path=

"*.ascx"

verb=

"*"

type=

"System.Web.HttpForbiddenHandler"

validate=

"True"

/>

<add path=

"*.config"

verb=

"*"

type=

"System.Web.HttpForbiddenHandler"

validate=

"True"

/>

<add path=

"*.cs"

verb=

"*"

type=

"System.Web.HttpForbiddenHandler"

validate=

"True"

/>

<add path=

"*"

verb=

"GET,HEAD,POST"

type=

"System.Web.DefaultHttpHandler"

validate=

"True"

/>

... ... 

//略

</httpHandlers><br><br><add path=

"*.jpg"

verb=

"*"

type=

"MyNameSpace.MyClass, MyDllName"

/><br>path指的是請求的檔案名稱,可以使用通配符擴大範圍,也可以明确指定這個handler僅用于處理某個特定的檔案(比如說:filename.aspx)的請求。verb指的是請求此檔案的方式,可以是post或

get

,用*代表所有通路方式。type屬性由“,”分隔成兩部分,第一部分是實作了接口的類名,第二部分是位于Bin目錄下的編譯過的程式集名稱

可以看到,在<httpHandlers>結點中将不同的檔案類型映射給不同的Handler去處理。是以,我們應該這樣了解HttpHanlder:一個HttpHanlder用于響應一類資源的請求,為一類的請求生成響應結果。

  我們經常用到的HttpHanlder有哪些? 

  1. aspx頁面。

  2. asmx服務檔案。

  3. ashx檔案(一般處理程式)。

  4. 實作IHttpHandler接口的自定義類型。

  我們通常使用HttpHanlder做什麼? 

HttpHanlder類型 實作目标
aspx頁面 響應aspx的請求,輸出HTML結果
asmx服務檔案 響應服務調用
ashx檔案(一般處理程式) 實作簡單的AJAX響應
實作IHttpHandler接口的自定義類 響應相應擴充名的請求

二、HttpModule

     一般來說,我們可以将Asp.Net中的事件分成三個級别, 應用程式級事件、其次是頁面級事件、最下面是控件級事件,事件的觸發分别與 應用程式周期、頁面周期、控件周期緊密相關。而 HttpModule 的作用是與應用程式事件密切相關的。我們通過Http Module在Http請求管道(Pipeline)中注冊期望對應用程式事件做出反應的方法,在相應的事件觸發的時候便會調用Http Module注冊了的方法。.Net 本身已經有很多的Http Module。與 Http Handler類似,我們需要打開機器上C:\WINDOWS\Microsoft.NET\Framework\ v2.0.50727\CONFIG 目錄下的 web.config 檔案。找到 <httpModules/> 結點,應該可以看到下面的内容

<httpModules>

    <add name="OutputCache" type="System.Web.Caching.OutputCacheModule" />

    <add name="Session" type="System.Web.SessionState.SessionStateModule" />

    <add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule" />

    <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" />

    <add name="PassportAuthentication" type="System.Web.Security.PassportAuthenticationModule" />

    <add name="RoleManager" type="System.Web.Security.RoleManagerModule" />

    <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" />

... 略

</httpModules>

type屬性與所說的http handler結點的type屬性類似都代表了相應的程式集,但與http handler 不同,module隻提供了一個name屬性,沒有諸如 path這樣指定某一特定(或者用通配符 * 代表某一種類)檔案的處理程式。這是與Module的特點相關的,我們知道 module 是響應應用程式周期中觸發的事件,對于所有送出到aspnet_isapi.dll的請求都一樣

舉例:

<system.web>

    <httpModules>

       <add name="CustomModuleName" type="myNameSpace.ModuleDemo, myDll"/>

    </httpModules>

</system.web>

可通過應用程式(HttpApplication)的Modules屬性擷取HttpModuleCollection集合,然後通過name屬性,進一步擷取HttpModule對象。

通過name屬性還可在global.asax中檔案中編寫自定義HttpModule暴露出的事件的處理程式采用的格式是:void ModuleName_EventName(object sender, EventArgs e)

下面這張表格列出了C:\WINDOWS\Microsoft.NET\Framework\ v2.0.50727\CONFIG下的Web.Config中的 Asp.Net 内置的Http Modules 及其主要作用。

名稱 類型 功能
OutputCache System.Web.Caching.OutputCacheModule 頁面級輸出緩存
Session System.Web.SessionState.SessionStateModule Session狀态管理
WindowsAuthentication System.Web.Security.WindowsAuthenticationModule 用內建Windows身份驗證進行用戶端驗證
FormsAuthentication System.Web.Security.FormsAuthenticationModule 用基于Cookie的窗體身份驗證進行用戶端身份驗證
PassportAuthentication System.Web.Security.PassportAuthenticationModule 用MS護照進行客戶身份驗證
RoleManager System.Web.Security.RoleManagerModule 管理目前使用者角色
UrlAuthorization System.Web.Security.UrlAuthorizationModule 判斷使用者是否被授權通路某一URL
FileAuthorization System.Web.Security.FileAuthorizationModule 判斷使用者是否被授權通路某一資源
AnonymousIdentification System.Web.Security.AnonymousIdentificationModule 管理Asp.Net應用程式中的匿名通路
Profile System.Web.Profile.ProfileModule 管理使用者檔案檔案的創立 及相關事件
ErrorHandlerModule System.Web.Mobile.ErrorHandlerModule 捕捉異常,格式化錯誤提示字元,傳遞給用戶端程式

  我們用HttpModule做什麼事情? 

  1. 修改某些請求(例如前面的示例修改了響應頭)。

  2. 檢查請求(例如身份認證檢查)。

  HttpModule能處理哪些請求呢? 

  1. 預設是全部進入ASP.NET的請求。

  2. 如果隻需要處理部分請求,那麼請自行判斷。

三、總結

   HttpHandler相當于一條水管,HttpModule相當于一小節水管。需要過濾的長水管裡面都可以裝上。

   HttpHandler練習參照:http://www.cnblogs.com/JimmyZhang/archive/2007/09/15/894124.html

   HttpModule練習參照   http://www.cnblogs.com/JimmyZhang/archive/2007/11/25/971878.html