IHttpModule接口
轉自:http://hi.baidu.com/xiaocai0923/blog/item/426f88cb642e8a57f31fe7f0.html
IHttpModule向實現類提供模塊初始化和處置事件。
IHttpModule包含兩個方法:
public void Init(HttpApplication context);
public void Dispose();
Init(): 這個方法接受一個HttpApplication對象,HttpApplication代表了當前的應用程序,我們需要在這個方法內注冊 HttpApplication對象暴露給客戶端的事件??梢?#xff0c;這個方法僅僅是用來對事件進行注冊,而實際的事件處理程序,需要我們另外寫方法。
整個過程很好理解:
1.??????當站點第一個資源被訪問的時候,Asp.Net會創建HttpApplication類的實例,它代表著站點應用程序,同時會創建所有在Web.Config中注冊過的Module實例。
2.??????在創建Module實例的時候會調用Modul的Init()方法。
3.??????在Init()方法內,對想要作出響應的HttpApplication暴露出的事件進行注冊。(僅僅進行方法的簡單注冊,實際的方法需要另寫)。
4.??????HttpApplication在其應用程序周期中觸發各類事件。
5.??????觸發事件的時候調用Module在其Init()方法中注冊過的方法。
Dispose():它可以在進行垃圾回收之前進行一些清理工作。
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請求輸出流中寫入文字
本例中,我們僅用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請求的輸入流中分別寫入不同的內容。
接下來在 Web.config 的 System.web 結點中寫入以下內容:
<system.web>
??? <httpModules>
??????? <add name="MyModule" type="ModuleDemo" />
??? </httpModules>
</system.web>
在這冊我們自己的http module 時,假設類名為ModuleDemo,位于myNameSpace命名空間下,程序集名稱為myDll,我們只需將myDll.dll拷貝到Bin目錄 下,并在站點的 web.config 文件 system.web 結點下創建 httpModules 結點:
<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)。
posted on 2012-04-23 11:12 巛 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/irelands/archive/2012/04/23/2466150.html
總結
以上是生活随笔為你收集整理的IHttpModule接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快手APP如何填写邀请码(最新快手APP
- 下一篇: 史上最快消息内核——ZeroMQ