IHttpModule向實現類提供模塊初始化和處置事件。
IHttpModule包含兩個方法:web
public void Init(HttpApplication context);
public void Dispose();
Init():這個方法接受一個HttpApplication對象,HttpApplication表明了當前的應用程序,咱們須要在這個方法內註冊 HttpApplication對象暴露給客戶端的事件。可見,這個方法僅僅是用來對事件進行註冊,而實際的事件處理程序,須要咱們另外寫方法。
整個過程很好理解:
1. 當站點第一個資源被訪問的時候,Asp.Net會建立HttpApplication類的實例,它表明着站點應用程序,同時會建立全部在Web.Config中註冊過的Module實例。
2. 在建立Module實例的時候會調用Modul的Init()方法。
3. 在Init()方法內,對想要做出響應的HttpApplication暴露出的事件進行註冊。(僅僅進行方法的簡單註冊,實際的方法須要另寫)。
4. HttpApplication在其應用程序週期中觸發各種事件。
5. 觸發事件的時候調用Module在其Init()方法中註冊過的方法。
Dispose():它能夠在進行垃圾回收以前進行一些清理工做。app
public class ModuleDemo:IHttpModule
{
public void Init(HttpApplication context) {
// 註冊HttpApplication應用程序 BeginRequest 事件
// 也能夠是其餘任何HttpApplication暴露出的事件
context.BeginRequest += new EventHandler(context_BeginRequest);
}
void context_BeginRequest(object sender, EventArgs e) {
HttpApplication application = (HttpApplication)sender;
HttpContext context = application.Context;
// 作些實際的工做,HttpContext對象都得到了,剩下的基本能夠自由發揮了
}
public void Dispose() {
}
}
經過Http Module向Http請求輸出流中寫入文字spa
本例中,咱們僅用BeginRequest事件和 EndRequest 事件對 Http Module 的使用做以說明。咱們經過這個範例,瞭解 Http Module 基本的使用方法。對象
首先,請建立一個新的站點,在App_Code目錄中添加類文件: ModuleDemo.cs:事件
public class ModuleDemo:IHttpModule
{
// Init方法僅用於給指望的事件註冊方法
public void Init(HttpApplication context) {
context.BeginRequest += new EventHandler(context_BeginRequest);
context.EndRequest += new EventHandler(context_EndRequest);
}
// 處理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() {
}
}資源
上面的代碼很簡單,它註冊了 HttpApplication實例的 BeginRequest 事件 和 EndRequest事件,事件處理方法的做用僅僅是在http請求開始和結束的時候,給http請求的輸入流中分別寫入不一樣的內容。it
接下來在 Web.config 的 System.web 結點中寫入如下內容:io
<system.web>
<httpModules>
<add name="MyModule" type="ModuleDemo" />
</httpModules>
</system.web>class
在這冊咱們本身的http module 時,假設類名爲ModuleDemo,位於myNameSpace命名空間下,程序集名稱爲myDll,咱們只需將myDll.dll拷貝到Bin目錄下,並在站點的 web.config 文件 system.web 結點下建立 httpModules 結點: module
<system.web>
<httpModules>
<add name="CustomModuleName" type="myNameSpace.ModuleDemo, myDll"/>
</httpModules>
</system.web>
type屬性由分號「,」分爲兩部分,前面是命名空間及類名,也就是類型名;後面是程序集名。若是咱們將代碼建立在App_Code目錄中,則不須要再指定程序集名。
name屬性由咱們本身命名,不必定與類名相同,此處我將它命名爲「CustomModuleName」。咱們能夠經過應用程序(HttpApplication) 的Modules屬性獲取HttpModuleCollection集合,而後經過name屬性,進一步獲取HttpModule對象。
經過name屬性,咱們還能夠在global.asax中文件中編寫自定義HttpModule暴露出的事件的處理程序,它採用的格式是:void ModuleName_EventName(object sender, EventArgs e)。