學習筆記
ASP.Net處理Http Request時,使用Pipeline(管道)方式,由各個HttpModule對請求進行處理,然后到達 HttpHandler,HttpHandler處理完之后,仍經過Pipeline中各個HttpModule的處理,最后將HTML發送到客戶端瀏覽器中。
生命周期中涉及到幾個非常重要的對象:HttpHandler,HttpModule,IHttpHandlerFactory
題外話
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")]
運行結果

總結:
1、配置HttpModule的方式有兩種,一種直接在Web.config添加,第二種 動態的配置,不過需要引入程序集
2、需求不是很大的話我們可以直接使用Global.asax配置
3、動態加載注冊自定義HttpModule只能使用一次