HttpHandler和HttpModule 區別

來源:互聯網
上載者:User

ASP.Net處理Http Request時,使用Pipeline(管道)方式,由各個HttpModule對請求進行處理,然後到達 HttpHandler,HttpHandler處理完之後,仍經過Pipeline中各個HttpModule的處理,最後將HTML發送到用戶端瀏覽 器中。
生命週期中涉及到幾個非常重要的對象:HttpHandler,HttpModule,IHttpHandlerFactory,他們的執行(順序)大致 的執行過程是這樣的:client端發送頁面請求,被IIS的某個進程截獲,它根據申請的頁 面尾碼(.aspx)不同,調用不同的頁面處理常式(.asp->asp.dll; .aspx->ISAPI.dll).而頁面處理常式在處理過程中,則要經曆HttpModule,HttpHandler的處理:前者 HttpModule用於頁面處理前和處理後的一些事件的處理,後者HttpHandler進行真正的頁面的處理。
如前所說,HttpModule會在頁面處理前和後對頁面進行處理,所以它不會影響真正的頁面請求。
常用在給每個頁面的頭部或者尾部添加一些資訊(如版 權聲明)等.曾經見過一些免費的空間,我們的頁面上傳上去後,瀏覽的時候發現,
在每個頁面的頭部和尾部多了很多小廣告....,如果理解了 HttpModule的原理,要做這個就不是很難了~

IHttpModule與IHttpHandler的區別整理
1.先後次序.先IHttpModule,後IHttpHandler. 注:Module要看你響應了哪個事件,一些事件是在Handler之前啟動並執行,一些是在Handler之後啟動並執行
2.對請求的處理上:
IHttpModule是屬於大小通吃類型,無論用戶端請求的是什麼檔案,都會調用到它;例如aspx,rar,html的請求.
IHttpHandler則屬於挑食類型,只有ASP.net註冊過的檔案類型(例如aspx,asmx等等)才會輪到調用它.
3.IHttpHandler按照你的請求 產生響應的內容,IHttpModule對請求進行預先處理,如驗證、修改、過濾等等,同時也可以對響應進行處理
asp.net 事件模型機制
一
客戶的請求頁面由aspnet_isapi.dll這個動態串連庫來處理,把請求的aspx檔案發送給CLR進行編譯執行,然後把Html流返回給瀏覽器
二 頁面事件
執行順序
Page_Init:初始化值或串連
Page_Load:主要使用IsPostBack,該事件主要執行一系列得操作來首次建立asp.net頁面或響應
由投遞引起得用戶端事件。在此事件之前,已還原頁面和控制項檢視狀態。
Page_DataBind:在頁面層級上調用,也可在單個控制項中調用。
DataBind_PreRender:資料繫結預呈現,恰好在儲存檢視狀態和呈現控制項之前激發此事件。
Page_Unload:此事件是執行最終清理工作的。
非確定事件
Page_Error:如果在頁面處理過程中出現未處理的例外,則激發error事件。
Page_AbortTransaction:交易事件,交易處理中如果已終止交易,則激發此事件,購物車常用。
Page_CommitTransaction:如果已成功交易,則激發此事件。
Global.asax中的事件(執行順序)
Application_Start:應用程式啟動時激發
Application_BeginRquest:http請求開始時激發
Application_AuthenticateRequest: 應用程式核准http請求時激發
Session_Start: 會話啟動時激發
Application_EndRequest:Htttp請求結束時激發
Session_End:會話結束時激發
Application_End:應用程式結束時激發
Application_Error: 發生錯誤時激發
ISAPI: 向web伺服器插入某些組建,擴充功能,增強web伺服器功能。
ISAPI: 擴充,win32的動態連結程式庫,譬如aspnet_isapi.dll,可以把ISAPI擴充看作是一個普通的應用程式,它處理的目標是HTTP請求。
ISAPI: 過濾器,web伺服器把請求傳遞給相關的過濾器,接下來過濾器可能修改請求,執行某些操作等等。
ASP.NET請求的處理過程:
基於管道模型,在模型中ASP.NET把http請求傳遞給管道中所有的模組。每個模組都接收HTTP請求,並有完全的控制權。
一旦請求經過了所有的HTTP模組,最終被HTTP處理常式處理。HTTP處理常式對請求進行一些處理,並且結果將再次經過模組管道中的HTTP模組。
httpmodule
ISAPI過濾器(篩選器):IIS本身是不支援動態網頁面的,也就是說他僅僅支援靜態HTML頁面的內容,對於.asp .aspx .cgi .php等,
IIS並不知道如果處理這些尾碼標記,它就會把它當作文本,絲毫不做處理髮送到用戶端。為瞭解決這個問題,IIS有一種機制,叫做ISAPI的過濾器。它是一個COM組件。
ASP.NET服務在註冊到IIS的時候,會把每個擴充可以處理的副檔名註冊到IIS裡面(如*.ascx *.aspx等)。
擴充啟動後,就根據定義好的方式來處理IIS所不能處理的檔案,然後把控制權跳轉到專門處理代碼的進程中,asp.net中是 aspnet_isapi.dll。讓這個進程開始處理代碼,產生標準的HTML代碼,產生後把這些代碼加入到原有的HTML中,最後把完整的HTML返 回給IIS,IIS再把內容發送到用戶端。
HttpModule
Http模組實現了過濾器(ISAPI filter)的功能,它是實現了System.Web.IHttpModule介面的.net組件。
這些組件通過在某些事件中註冊自身,把自己插入到ASP.NET請求處理管道。當這些事件發生的時候,ASP.NET調用對請求有興趣的HTTP模組,
這樣該模組就能處理請求了。有時候需要過慮一下http請求,注意它不是覆蓋其他的包括系統內建的HttpModule,在Machine.config中配置完成。
HttpHandler
它實現了ISAPI Extention的功能,它處理請求(Request)的資訊和發送響應(Response)。HttpHandler功能的通過必須實現IHttpHandler介面。
HTTP處理常式是實現System.Web.IHttpHandler介面的.NET組件。任何實現了該介面的類都可以用於處理輸入的Http請求。它就是Http處理常式。
在以前的ASP時候,當請求一個*.asp分頁檔的時候,這個HTTP請求首先會被一個名為inetinfo.exe進程所截獲,這個進程實際上就是www服務。
截獲之後它會將這個請求轉交給asp.dll進程,這個進程就會解釋這個asp頁面,然後將解釋後的資料流返回給用戶端瀏覽器。
其實ASP.DLL是一個依附在IIS的ISAPI檔案,它負責了對諸如ASP檔案,ASA等檔案的解釋執行,
ASP.NET的HTTP請求處理方法
當用戶端向web伺服器請求一個*.aspx的分頁檔時,同asp類似,這個http請求也會被inetinfo.exe進程截獲(www服務),它判斷檔案尾碼之後,
把這個請求轉交給ASPNET_ISAPI.DLL而ASPNET_ISAPI.DLL則會通過一個Http PipeLine的管道,將這個http請求發送給ASPNET_WP.EXE進程,
當這個HTTP請求進入ASPNET_WP.EXE進程之後,asp.net framework就會通過HttpRuntime來處理這個Http請求,處理完畢後將結果返回給用戶端。
當一個http請求被送入到HttpRuntime之後,這個Http請求會繼續被送入到一個被稱之為HttpApplication Factory的一個容器當中
,而這個容器會給出一個HttpApplication執行個體來處理傳遞進來的http請求,而後這個Http請求會依次進入到如下幾個容器中:
HttpModule --> HttpHandler Factory --> HttpHandler
當系統內部的HttpHandler的ProcessRequest方法處理完畢之後,整個Http Request就被處理完成了,用戶端也就得到相應的東東了。
完整的http請求在asp.net framework中的處理流程:
HttpRequest-->inetinfo.exe->ASPNET_ISAPI.DLL-->Http Pipeline-->ASPNET_WP.EXE-->HttpRuntime-->HttpApplication Factory-->
HttpApplication-->HttpModule-->HttpHandler Factory-->HttpHandler-->HttpHandler.ProcessRequest()
如果想在中途截獲一個httpRequest並做些自己的處理,就應該在HttpRuntime運行時內部來做到這一點,確切的說時在HttpModule這個容器中做到這個的。
系統本身的HttpModule實現一個IHttpModule的介面,當然我們自己的類也能夠實現IHttpModule介面,這就可以替代系統的HttpModule對象了。

原文地址:

http://www.sytm.net/jiejuefangan/k_20100619191534.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.