HttpModule在Web.config的配置和動態配置


學習筆記

ASP.Net處理Http Request時,使用Pipeline(管道)方式,由各個HttpModule對請求進行處理,然后到達 HttpHandler,HttpHandler處理完之后,仍經過Pipeline中各個HttpModule的處理,最后將HTML發送到客戶端瀏覽器中。
生命周期中涉及到幾個非常重要的對象:HttpHandlerHttpModuleIHttpHandlerFactory

題外話

HttpModule和HttpHander

頁面處理程序在處理過程中,則要經歷HttpModule,HttpHandler的處理:

前者HttpModule用於頁面處理前和處理后的一些事件的處理,后者HttpHandler進行真正的頁面的處理

如前所說,HttpModule會在頁面處理前和后對頁面進行處理,所以它不會影響真正的頁面請求

HttpModule與IHttpHandler的區別
1.先后次序.先IHttpModule,后IHttpHandler. 注:Module要看你響應了哪個事件,一些事件是在Handler之前運行的,一些是在Handler之后運行的

2.對請求的處理上:
   IHttpModule是屬於大小通吃類型,無論客戶端請求的是什么文件,都會調用到它;例如aspx,rar,html的請求.
   IHttpHandler則屬於挑食類型,只有ASP.net注冊過的文件類型(例如aspx,asmx等等)才會輪到調用它.
3.IHttpHandler按照你的請求生成響應的內容,IHttpModule對請求進行預處理,如驗證、修改、過濾等等,同時也可以對響應進行處理

在Web.config中配置(經典模式下不可行哦)

1.定義繼承了IHttpModule類

2.注冊事件

3.在Web.config配置

創建類

public class MyHttpMoudle:IHttpModule
  {

      public void Init(HttpApplication context)
      {
          context.BeginRequest += context_BeginRequest;
      }

      void context_BeginRequest(object sender, EventArgs e)
      {
          HttpApplication app = sender as HttpApplication;
          if (app != null)
          {
              app.Context.Response.Write("你好啊");

          }
      }

      public void Dispose()
      {

      }
  }

配置

在System.Web節點下

<httpModules>
      <add name="Test" type="Webs復習.Util.MyHttpMoudle"/>
    </httpModules>

這樣就將自定義的HttpModule類MyHttpModule插入到了當前web的HttpModule的Pipeline中。 HttpModule主要功能是對Application的各個事件進行截取,在這些事件中完成自己的處理。其實如果自己開發一些項目,直接在 Global.asax中處理已經足夠了。如果是開發一個Framework或者是某些方面的組件,需要在事件中添加處理,開發自定義
的 HttpModule,可以避免使用Framework或者組件時,還得手工在Global.asax中添加代碼。目前想到的開發自定義HttpModule的用途,有全局的身份/權限驗證、自定義網站訪問/操作日志的記錄、處於管理/調試等目的對站點進行監控追蹤等。

 

動態注冊HttpModule

 

如果我們不想很麻煩的在配置文件里就進行配置,我們可以動態的配置。HttpApplication在初始化的時候會初始化所有配置文件里注冊的HttpModules,當然這個也是第一種的,不過還好,第二種動態加載在沒有讀取配置文件,也就是沒有編譯之前也可以完成添加HttpModule的功能,因為,讀取配置文件是在HttpApplication的處理過程,所以應該能想到如果想添加HttpModule肯定在創建HttpApplication之上,事實上也正是這樣。就是在HostingEnvironment這個類中

ASP.NET MVC3發布的時候提供了一個Microsoft.Web.Infrastructure.dll文件,這個文件就是提供了動態注冊HttpModule的功能

該程序集的靜態類DynamicModuleUtility里面有個RegisterModule是可以將我們定義的HttpModule類添加進去的

不過通過查看方法具體過程是這樣的

1。創建實現了IHttpModule的類

2.程序集標記為PreApplicationStartMethodAttribute特性

3.創建一個類,里面包含一個靜態方法,注冊自定義的類

 

 

因為HostingEnvironment的一個方法會遍歷應用程序下的所有程序集

判斷如果程序集標記為PreApplicationStartMethodAttribute特性,就會執行這個特性里指定的方法(靜態方法)

具體實現過程如下

定義類

public class MyHttpMoudle:IHttpModule
  {

      public void Init(HttpApplication context)
      {
          context.BeginRequest += context_BeginRequest;
      }

      void context_BeginRequest(object sender, EventArgs e)
      {
          HttpApplication app = sender as HttpApplication;
          if (app != null)
          {
              app.Context.Response.Write("自定義HttpModule");

          }
      }

      public void Dispose()
      {

      }
  }

中間類(里面包含了一個靜態的注冊方法)

 

public class RegisterModules
{

    private static bool hasLoad;
    public static void LoadPre()
    {
        if (!hasLoad)
        {
            hasLoad = true;

       //命名空間    Microsoft.Web.Infrastructure.DynamicModuleHelper;

            DynamicModuleUtility.RegisterModule(typeof(MyHttpMoudle));
        }
    }
}

 

 

最后按照要求添加特性如下

[assembly: PreApplicationStartMethod(typeof(RegisterModules), "LoadPre")]

 

運行結果

image

 

總結:

1、配置HttpModule的方式有兩種,一種直接在Web.config添加,第二種 動態的配置,不過需要引入程序集

2、需求不是很大的話我們可以直接使用Global.asax配置

3、動態加載注冊自定義HttpModule只能使用一次


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM