HTTPModules與HTTPHandler

HTTPModules與HTTPHandlerphp

一 asp.net請求的處理過程
-------------------
HttpModule  必需要掌握的東西
HttpHandler 必需要掌握的東西,很是有用
以上兩個的實例
---------------------
asp.net 事件模型機制web

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

客戶的請求頁面由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處理程序。api

 

在之前的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 身份驗證。沒法繼承此類app

--------------------------------------
這些系統默認的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()
    {
    }asp.net

    public String ModuleName
    {
        get { return "HelloWorldModule"; }
    }this

    // 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));
    }spa

    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(" .net

HelloWorldModule: Beginning of Request


");
    }

    private void Application_EndRequest(Object source, EventArgs e)
    {
        HttpApplication application = (HttpApplication)source;
        HttpContext context = application.Context;
        context.Response.Write("


HelloWorldModule: End of Request

");
    }

    public void Dispose()
    {
    }
}

               -----------------------------------------------------------------------------------深刻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容器進行調度和管理的,這樣作的優勢是大大加強了系統的負荷性,提高了效率。

相關文章
相關標籤/搜索