問題1:什么是HttpHandler?
問題2:什么是HttpModule?
問題3:什么時候應該使用HttpHandler什么時候使用HttpModule?
答案1:HttpHandler,Http請求的處理者,例如ScriptHandler、WebServiceHandler,IHttpHandler的實現都是為了處理某一類的請求。如ScriptHandler負責處理對腳本的請求。
答案2:HttpModule,Http模塊。實際上就是那19個標准事件的處理者,或者說19個標准事件的訂閱者,比如OutputCacheModule,SessionStateModule。詳細可以到在這篇文章里面看到http://www.cnblogs.com/kissdodog/p/3527922.html。
一、HttpHandler的職責
1、由於HTTP請求有很多種請求類型,比如請求aspx、html、jpg等等。因此,僅僅由HttpApplication直接處理請求時很臃腫的,而且不利於擴展。因此Asp.net采用了抽象工廠模式來處理這些請求。Asp.net在web.config的架構中,允許我們制定某些請求映射到一個HttpHandlerFactory。
<!--適用於IIS6的配置--> <system.web> <httpHandlers> <add path="*.aspx" verb="*" type="MyMVC.MvcPageHandlerFactory, MyMVC" validate="true" /> </httpHandlers> </system.web> <!--適用於IIS7的配置(集成模式)--> <system.webServer> <handlers> <add name="MvcPageHandlerFactory" verb="*" path="*.aspx" type="MyMVC.MvcPageHandlerFactory, MyMVC" preCondition="integratedMode" /> </handlers> </system.webServer>
所以,我們應該這樣理解HttpHanlder:一個HttpHanlder用於響應一類的請求,為一類的請求生成響應結果。
我們經常用到的HttpHanlder有哪些?
1. aspx頁面。
2. asmx服務文件。
3. ashx文件(一般處理程序)。
4. 實現IHttpHandler接口的自定義類型。
我們通常使用HttpHanlder做什么?
HttpHanlder類型 | 實現目標 |
aspx頁面 | 響應aspx的請求,輸出HTML結果 |
asmx服務文件 | 響應服務調用 |
ashx文件(一般處理程序) | 實現簡單的AJAX響應 |
實現IHttpHandler接口的自定義類 | 響應什么擴展名的請求? |
二、HttpModule的職責
有時候有些頁面需要一些相同的檢查功能,比如身份驗證。明顯使用HttpHandler是不方便的,因為不是所有的頁面都需要去調用那些相同的功能。
HttpModule的設計正是提供了一個靈活的方法解決這種功能重用的問題,它采用事件(觀察者)的設計模式,將某些HttpHandler都需要的功能抽取出來,形成不同的觀察者類型,這些觀察者類型可以編譯成類庫形式,供多個網站共用。為了讓ASP.NET管線更靈活,ASP.NET允許我們再web.config中自由配置需要的HttpModule。
<!--適用於IIS6的配置--> <system.web> <httpModules> <add name="SetOutputCacheModule" type="MyMVC.SetOutputCacheModule, MyMVC"/> </httpModules> </system.web> <!--適用於IIS7的配置(集成模式)--> <system.webServer> <modules> <add name="SetOutputCacheModule" type="MyMVC.SetOutputCacheModule, MyMVC" preCondition="integratedMode" /> </modules> </system.webServer>
配置只是告訴ASP.NET,這些HttpModule需要運行起來,可能會用得着。
我們用HttpModule做什么事情?
1. 修改某些請求(例如前面的示例修改了響應頭)。
2. 檢查檢查請求(例如身份認證檢查)。
HttpModule能處理哪些請求呢?
1. 默認是全部進入ASP.NET的請求。
2. 如果只需要處理部分請求,那么請自行判斷。
三、總結
HttpHandler相當於一條水管,HttpModule相當於一小節水管。HttpHandler有很多條,一條流油,一條流水等等。HttpModule相當於一小截,需要過濾的長水管里面都可以裝上。