一,什么是HttpHandler
在asp.net的網站中,在一個普通的請求地址“http://localhost:56093/Default.aspx”中“Default.aspx”就是handler。
也就是說在asp.net中page就是handler,在asp.net MVC中Controller就是handler,handler就是最終處理請求的那個類。
假如http://localhost:56093/Default.aspx這個頁面輸出的是"Helloworld"幾個字。現在http://localhost:56093/這個站點下有100個頁面,我想要這個站點的請求都輸出
Helloworld字眼怎么辦,並且我要所有的請求都必須驗證登錄了。那是不是需要在100個頁面上都寫代碼呢。微軟這么厲害肯定給出了簡單的解決方案。就是“HttpModule”.
二,簡單的請求流程
相信各位看了不少asp.net請求處理流程的文檔。這里推薦園子里Edison Chou的ASP.Net請求處理機制初步探索之旅。
在請求進入到ASP.NET管道后,有三個重要的類,“ISAPIRuntme”,“HttpRuntime”,"HttpApplication".
1,ISAPIRuntme中根據報文創建了“HttpWorkerRequest”類。
2,接着HttpRuntime開始干活,而且大部分的活都是HttpRuntime在干。HttpRuntime初始化了HttpWorkerRequest創建了HttpContent,創建了HttpRequest和HttpResponse,3,創建了HttpApplication(web應用程序實例)。最后調用handler處理請求的也是HttpRuntime中完成的。
3,HttpApplication中初始化各個HttpModule並且注冊HttpApplication的19個事件(並且所有的HttpModule都注冊了19事件,只是HttpApplication有19事件可以去讓HttpModule注冊,注冊了就會被執行)。
然后HttpRuntime會依次去執行各個HttpModule的相應的事件。接着去調用匹配的handler,然后以回到HttpModule相應的事件,然后一層層返回,直到IIS把內容返回給瀏覽器。
三,什么HttpModule
IHttpModule就是一個接口,有個重要的方法“void Init(HttpApplication context)”,在這個方法里可以給context(HttpApplication )注冊事件。
任何類繼承了IHttpModule並且在config中配置了,那么在HttpApplication 的管道中,它的事件就會被執行(如果注冊了的話)。
asp.net默認的HttpModule有:
asp.net中有身份驗證功能,如果表單驗證,如果沒登錄就會在處理請求之前跳轉到登錄頁面。就是在“FormsAuthentication”中完成的。
這些HttpModule,在HttpApplication中全部會加載進來,在HttpRuntime中會依次去執行它的19個事件(全部19個事件全部注冊了的話)
1,那什么時候去執行handler呢
在第11個事件“PreRequestHandlerExecute”和第12個事件“PostRequestHandlerExecute“之間去調用handler,調用完后繼續執行httpmodule剩下的事件。
2,這么多HttpModule,HttpRuntime是怎么去執行的呢?
按HttpModule的順序依次執行,假如有兩個HttpModule:Module1和Module2,那么第一個事件”BeginRequest“的執行順序是:Module1的BeginRequest,Module2的BeginRequest。
3,是不是每個HttpModule里都會執行一次Handler呢?
不是,handler只執行一次。在所有HttpModule的前面11個事件依次執行完后去調用handler,調用完后再依次執行HttpModule剩下的事件。
例子如下:
第一個HttpModule:
第二個HttpModule:
handler處理:
配置HttpModule,讓HttpAplication加載:
請求這個Default頁面顯示的效果為:
四,為什么要有HttpModule
有許多功能是需要我們在handler之前就要去做的,而且也不可能去每一個handler去做,比如身份驗證。
在實際業務場景中我們也有可能需要在handler之前做大量的工作。所以微軟就公開了這個接口,可以讓我們更靈活的應用在我們的業務場景中。
五,ASP.NET MVC的區別
asp.net mvc與asp.net的請求管道模型是一樣的。mvc最重要的是它的路由功能,而且它的本質上就是一個HttpModule,
在asp.net全局配置文件中配置了這個Module,UrlRoutingModule源碼
在該Module中注冊了”PostResolveRequestCache“事件,對請求進行攔截。根據mvc的路由規則找到對應的controller(handler),然后調用匹配的action.