出處: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>結點中将不同的檔案類型映射給不同的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