天天看點

HttpModule與HttpHandler詳解(轉)

一 asp.net請求的處理過程

-------------------

HttpModule必須要掌握的東西

HttpHandler 必須要掌握的東西,非常有用

以上兩個的執行個體

---------------------

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對象了。

ASP.NET系統中預設的HttpModule:

DefaultAuthenticationModule 確定上下文中存在 Authentication 對象。無法繼承此類。

FileAuthorizationModule 驗證遠端使用者是否具有通路所請求檔案的 NT 權限。無法繼承此類。

FormsAuthenticationModule 啟用 ASP.NET 應用程式以使用 Forms 身份驗證。無法繼承此類。

PassportAuthenticationModule 提供環繞 PassportAuthentication 服務的包裝。無法繼承此類。

SessionStateModule   為應用程式提供會話狀态服務。

UrlAuthorizationModule   提供基于 URL 的授權服務以允許或拒絕對指定資源的通路。無法繼承此類。

WindowsAuthenticationModule 啟用 ASP.NET 應用程式以使用 Windows/IIS 身份驗證。無法繼承此類

--------------------------------------

這些系統預設的HttpModule是在檔案machine.config中配置的,和我們開發時使用到的web.config的關系是:是在ASP.NET FRAMEWORK啟動處理一個Http Request的時候,它會依次加載machine.config和請求頁面所在目錄的web.config檔案,如果在machine中配置了一個自己的HttpModule,你仍然可以在所在頁面的web.config檔案中remove掉這個映射關系。

public class HelloWorldModule : IHttpModule

{

  public HelloWorldModule()

  {

  }

  public String ModuleName

  {

    get { return "HelloWorldModule"; }

  }

  // In the Init function, register for HttpApplication

  // events by adding your handlers.

  public void Init(HttpApplication application)

  {

    application.BeginRequest +=

        (new EventHandler(this.Application_BeginRequest));

    application.EndRequest +=

        (new EventHandler(this.Application_EndRequest));

  }

  private void Application_BeginRequest(Object source,

      EventArgs e)

  {

  // Create HttpApplication and HttpContext objects to access

  // request and response properties.

    HttpApplication application = (HttpApplication)source;

    HttpContext context = application.Context;

    context.Response.Write("<h1><font color=red> HelloWorldModule: Beginning of Request</font></h1><hr>");

  }

  private void Application_EndRequest(Object source, EventArgs e)

  {

    HttpApplication application = (HttpApplication)source;

    HttpContext context = application.Context;

    context.Response.Write("<hr><h1><font color=red>HelloWorldModule: End of Request</font></h1>");

  }

  public void Dispose()

  {

  }

}

  <system.web>

  <HttpModules>

  <add name="HelloWorldModule" type="HelloWorldModule"/>

  </HttpModules>

  </system.web>

-----------------------------------------------------------------------------------

深入HttpModule

一個Http請求在被ASP.NET Framework捕獲之後會依次交給HttpModule以及HttpHandler來處理。hm與hh之間不是完全獨立的,實際上,http請求在hm傳遞的過程中會在某個事件内将控制權轉交給hh的,而真正的處理在HttpHandler中執行完成後,HttpHandler會再次将控制權交還給HttpModule上面的代碼中的HttpModule的Init()中的參數是HttpApplication類型,它具有許多事件,包括BeginRequest,EndRequest,AuthentiacteRequest 等等。

-----------------------------------------------------------------

IHttpHandler

它是asp.net Framework提供的一個接口,定義了如果要實作一個Http請求的處理所需要必須實作的一些系統約定。也就是說,如果你想要自行處理某些類型的HTTP請求資訊流的話,你需要實作這些系統約定才能做到。譬如一個*.aspx檔案,用來處理此類型的Http請求,ASP.NET FRAMEWORK将會交給一個名為System.Web.UI.PageHandlerFactory的HttpHandler類來處理。

HH和HM一樣,系統會在最初始由ASP.NET FRAMEWORK首先加載machine.config中的HttpHandler,而後會加載Web應用程式所在目錄的web.config中的使用者自定義的HttpHandler類。但是系統與我們自定義的HH之間的關系是"覆寫"的,也就是說如果我們自定義了一個針對"*.aspx"的HttpHandler類的話,那麼系統會将對此http請求的處理權完全交給我們自己定義的這個HttpHandler類來處理,而我們自己的HttpHandler類則需要自己完全解析這個Http請求,并作出處理。

IHttpHandler接口中最重要的方法ProcessRequest,這個方法就是HttpHandler用來處理一個Http請求,當一個Http請求經過由HttpModule容器傳遞到HttpHandler容器中的時候,framework會調用HttpHandler的ProcessRequest方法來做對這個Http請求做真正的處理。

framework實際上并不是直接把相關頁面的HTTP請求定位到一個内部預設的IHttpHandler容器之上的,而是定位到了其 内部預設的IHttpHandler Factory上了。IHttpHandler Factory的作用就是對很多系統已經實作了的IHttpHandler容器進行排程和管理的,這樣做的優點是大大增強了系統的負荷性,提升了效率

*************************另外一篇************************************

URL:http://www.it118.org/Specials/321869DD-98CB-431B-B6D2-82D973CD739D/A7A25906-65B5-432F-AC75-62CBE018B420.htm

or

http://blog.csdn.net/jhlovett/archive/2009/03/10/3973198.aspx

繼續閱讀