關於HttpModule和HttpHandler

導讀:
  記得很久以前就看到過一篇文章,說搞不懂HttpModule,HttpHandler和HttpContext的算不上好的ASP.NET程序員。由此看來,在此之前我都算不上一個好的ASP.NET程序員。
  
  
  要想搞清楚上面的幾個東西,首先就要搞清楚當一個HttpRequest發送到服務器之後,服務器是怎麼處理這個Request並且將處理的結果返回給客戶端。在ASP.NET中,當一個HttpRequest到達服務器時,它會首先被inetinfo.exe截獲,然後轉交給ASPNET_ISAPI.dll處理。而ASPNET_ISAPI.dll則將請求轉送到一個HttpPipeline的管道里面,ASPNET_WP.exe進程會接到請求並把它交給HttpRuntime來處理。如下圖
  
  
  那麼請求在這個HttpRuntime裏面又怎麼工作呢?我們可以用下面的這個流程來表示:
  HttpRequest ----> HttpApplicationFactory ----> 生成一個HttpApplication實例 ----> HttpModule ----> HttpHandlerFactory ----> HttpHandler ----> 生成結果傳輸回客戶端,在這裏我們已經可以看到HttpModule和HttpHandler了!
  首先我們看HttpModule,它到底是做什麼用的呢?
  MSDN上的定義:http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpguide/html/cpconHttpModules.asp
  從中可以看到我們可以自定義編程HttpModule來實現對HttpRequest中的內容做一個處理或者過濾。下面的鏈接中可以轉向一個MSDN的例子:http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpguide/html/cpconcustomhttpmodules.asp,具體我這裏就不多說了。
  具體在這個例子中,我們可以看到我們是通過在IHttpModule接口中的Init方法中註冊HttpApplication中的BeginReqeust和EndRequest事件來使我們可以在不同的階段處理不同的事情。但是實際上,HttpApplication中包含了更多的事件,見MSDN鏈接:http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpref/html/frlrfsystemwebhttpapplicationclasstopic.asp
  再看HttpHanlder,先回顧一下上面講到的HttpApplication中的那些事件:
  [執行處理程序。]
  PostRequestHandlerExecute
  當進入到這個步驟時,HttpModule開始將Request轉移給HttpHandler來處理,處理完的結果再轉交給HttpModule發回到客戶端。那麼HttpHandler又怎麼工作呢?其實跟HttpModule差不多,都是通過實現IHttpHanler接口,然後在web.config中註冊自己的Handler來執行。
  關於這個如何執行以及例子都可以參考MSDN,我想那邊的可能更好懂一點。鏈接:http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpguide/html/cpconaspnetrequestprocessing.asp
  最後關於HttpContext,它是在HttpApplication的實例創建出來之後就一直存在着,可以方便你的去訪問HttpRequest中的一些信息。但是需要注意的是在使用裏面的一些對象之前建議先弄明白裏面一些對象的生命週期,否則可能會引發異常。更多的信息可以參考《ASP.NET Framework深度歷險》一書。
  關於實踐:DNN中大量使用了自定義的HttpModule和HttpHandler來處理這些東西,所以如果有條件不妨去研究DNN,看看這些東西到底能爲我們做些什麼。
  
  
  參考資料:
  《ASP.NET Framework深度歷險》
  《DotNetNuke Friendly Urls》
  MSDN
  http://www.microsoft.com/china/msdn/library/architecture/architecture/architecturetopic/BuildSucApp/BSAAsecmodsecmod37.mspx?mfr=true

本文轉自
http://www.cnblogs.com/gamix/archive/2006/06/08/420470.html  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章