asp.net基礎-HttpModule

來源:互聯網
上載者:User

  HttpModule是向實作類別提供模組初始化和處置事件。當一個HTTP請求到達HttpModule時,整個ASP.NET Framework系統還並沒有對這個HTTP請求做任何處理,也就是說此時對於HTTP請求來講,HttpModule是一個HTTP請求的“必經之路”,所以可以在這個HTTP請求傳遞到真正的請求處理中心(HttpHandler)之前附加一些需要的資訊在這個HTTP請求資訊之上,或者針對截獲的這個HTTP請求資訊作一些額外的工作,或者在某些情況下乾脆終止滿足一些條件的HTTP請求,從而可以起到一個Filter過濾器的作用。

1、 asp.net的HTTP請求處理過程

(1)、用戶端瀏覽器向伺服器發出一個http請求,此請求會被inetinfo.exe進程截獲,然後轉交給aspnet_isapi.dll進程,接著它又通過Http Pipeline的管道,傳送給aspnet_wp.exe這個進程,接下來就到了.net framework的HttpRunTime處理中心,處理完畢後就發送給使用者瀏覽器。 
(2)、當一個http請求被送入到HttpRuntime之後,這個Http請求會繼續被送入到一個被稱之為HttpApplication Factory的一個容器當中,而這個容器會給出一個HttpApplication執行個體來處理傳遞進來的http請求,而後這個Http請求會依次進入到如下幾個容器中:HttpModule --> HttpHandler Factory --> HttpHandler。當系統內部的HttpHandler的ProcessRequest方法處理完畢之後,整個Http Request就被處理完成了,用戶端也就得到相應的東東了。 
(3)完整的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() 

  也就是說一個HTTP請求在HttpModule容器的傳遞過程中,會在某一時刻(ResolveRequestCache事件)將這個HTTP請求傳遞給HttpHandler容器。在這個事件之後,HttpModule容器會建立一個HttpHandler的入口執行個體,但是此時並沒有將HTTP請求控制權交出,而是繼續觸發AcquireRequestState事件以及PreRequestHandlerExcute事件。在PreRequestHandlerExcute事件之後,HttpModule視窗就會將控制權暫時交給HttpHandler容器,以便進行真正的HTTP請求處理工作。

  而在HttpHandler容器內部會執行ProcessRequest方法來處理HTTP請求。在容器HttpHandler處理完畢整個HTTP請求之後,會將控制權交還給HttpModule,HttpModule則會繼續對處理完畢的HTTP請求資訊流進行層層的轉交動作,直到返回到用戶端為止。

(4)如果想在中途截獲一個httpRequest並做些自己的處理,就應該在HttpRuntime運行時內部來做到這一點,確切的說是在HttpModule這個容器中來實現。

 

2、 HttpModule工作原理

     負責監聽HttpRequest,同時對HttpRequest增添或者過濾掉一部分內容。也就是說,當一個HTTP請求到達HttpModule時,整個ASP.NET Framework系統還並沒有對這個HTTP請求做任何處理,也就是說此時對於HTTP請求來講,HttpModule是一個HTTP請求的“必經之路”,所以可以在這個HTTP請求傳遞到真正的請求處理中心(HttpHandler)之前附加一些需要的資訊在這個HTTP請求資訊之上,或者針對截獲的這個HTTP請求資訊作一些額外的工作,或者在某些情況下乾脆終止滿足一些條件的HTTP請求,從而可以起到一個Filter過濾器的作用。 
HttpModule實現了介面IHttpModule,我們可以自訂實現該介面的類,從而取代HttpModule。 

3、 編寫自己的HttpModule

  要實現HttpModule,必須實現介面IHttpModule。下面是IHttpModule介面分析:

using System;namespace System.Web{    public interface IHttpModule    {        //   銷毀不再被HttpModule使用的資源        void Dispose();        // 初始化一個Module,為捕獲HttpRequest做準備        void Init(HttpApplication context);    }}

  下面是自己的HttpModule:

  1.       當網站第一個資源被訪問的時候,Asp.Net會建立HttpApplication類的執行個體,它代表著網站應用程式,同時會建立所有在Web.Config中註冊過的Module執行個體。
  2.       在建立Module執行個體的時候會調用Modul的Init()方法。
  3.       在Init()方法內,對想要作出響應的HttpApplication暴露出的事件進行註冊。(僅僅進行方法的簡單註冊,實際的方法需要另寫)。
  4.       HttpApplication在其應用程式周期中觸發各類事件。
  5.       觸發事件的時候調用Module在其Init()方法中註冊過的方法。

using System;using System.Collections.Generic;using System.Linq;using System.Web;namespace Learning{    public class ModuleDemo : IHttpModule    {        // Init方法僅用於給期望的事件註冊方法        public void Init(HttpApplication context)        {            context.EndRequest += new EventHandler(context_EndRequest);            context.BeginRequest += new EventHandler(context_BeginRequest);                    }        // 處理BeginRequest 事件的實際代碼        void context_BeginRequest(object sender, EventArgs e)        {            HttpApplication application = (HttpApplication)sender;            HttpContext context = application.Context;            context.Response.Write("<h1 style='color:#00f'>來自HttpModule 的處理,請求到達</h1><hr>");        }        // 處理EndRequest 事件的實際代碼        void context_EndRequest(object sender, EventArgs e)        {            HttpApplication application = (HttpApplication)sender;            HttpContext context = application.Context;            context.Response.Write("<hr><h1 style='color:#f00'>來自HttpModule的處理,請求結束</h1>");        }        public void Dispose()        {        }    }}

  web.config

<configuration>  <system.web>    <compilation debug="true" targetFramework="4.0" />    <httpModules>      <add name="up" type="Learning.ModuleDemo,Learning"/>    </httpModules>  </system.web></configuration>

 

  在這冊我們自己的http module 時,假設類名為ModuleDemo,位於Learning命名空間下,程式集名稱為Learning,我們只需將Learning拷貝到Bin目錄下,並在網站的 web.config 檔案 system.web 結點下建立 httpModules 結點:

運行結果:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.