這幾天一直在忙期末考試,都沒時間來看看書了。
HttpModule在ASP.NET Framework中的位置
一個來自於用戶端的HTTP請求被截獲後經過層層轉交(怎麼都在踢皮球?呵呵)到達了HttpModule這個“請求監聽器”。HttpModule就類似於安插在ASPNET_WP.EXE進程中的一個***,稍微有些常識的人都會很自然的想象得到***是用來做什麼的,而我們的HttpModule可以說是作***的絕好人選了,但是需要明確的是,HttpModule絕對不是簡單的監聽器,它可以做到更多的東西,比如它可以對截獲的請求增加一些內容等等。那麼HttpModule在整個ASP.NET Framework中的位置處在哪裡呢?下面我們通過圖示來看看:
另外需要明白的是,當一個HTTP請求到達HttpModule的時候,整個ASP.NET Framework系統還並沒有對這個HTTP請求做任何的真正處理,也就是說此時對於HTTP請求來講,HttpModule只是它路過的一個地方而以。但是正是因為HttpModule是一個HTTP請求的“必經之路”,所以我們可以在這個HTTP請求傳遞到真正的請求處理中心(HttpHandler)之前附加一些我們需要的資訊在這個HTTP請求資訊之上,或者針對我們截獲的這個HTTP請求資訊作一些額外的工作,或者在某些情況下乾脆終止滿足一些條件的HTTP請求,從而可以起到一個Filter過濾器的作用,而不僅僅是一個***了。通過查閱MSDN(不要去相信.NET SDK內建的那個QuickStarts Web文檔,正式版本中竟然在很多地方沒有更新這個文檔,很多東西在正式版本是無效的),你會發現系統HttpModule實現了一個叫做IHttpModule的介面,很自然的就應當想到,只要我們自己的類能夠實現IHttpModule介面,不就可以完全替代系統的HttpModule了嗎?完全正確。在我們開始自己的HttpModule類之前,我先來告訴你系統中的那個HttpModule是什麼樣子的,ASP.NET系統中預設的HttpModule有以下幾個:
System.Web.Caching.OutputCacheModule System.Web.SessionState.SessionStateModule System.Web.Security.WindowsAuthenticationModule System.Web.Security.FormsAuthenticationModule System.Web.Security.PassportAuthenticationModule System.Web.Security.UrlAuthorizationModule System.Web.Security.FileAuthorizationModule 這些系統預設的HttpModule是在檔案machine.config中配置,這個檔案位於你安裝的.NET架構所在的目錄中,比如在你的系統檔案目錄中的C:\WINNT\Microsoft.NET\Framework\v1.0.3705\CONFIG\machine.config。在我們開發ASP.NET 應用程式的時候會頻繁的使用到一個web.config設定檔,那麼這個machine.config和我們常見的web.config有什麼關係呢?原來在ASP.NET Framework啟動處理一個Http Request的時候,她會依次載入machine.config以及你請求頁面所在目錄的web.config檔案,裡面的配置是有標籤的,什麼意思不說也知道了吧。如果你在machine.config中配置了一個自己的HttpModule,你仍然可以在離你最近web.config檔案中“remove”掉這個映射關係。
構建我們自己的HttpModule
在上一小節中,我們談到了系統預設的各個HttpModule均繼承實現了一個叫做IhttpModule的介面。我們先來看看這個介面的真實面目吧:
文法:public interface IHttpModule
需求:名稱空間: System.Web
平台: Windows 2000, Windows XP Professional, Windows .NET Server family
裝配件: System.Web (in System.Web.dll)
公用成員方法:void Dispose(); 參數:無傳回值:void 作用:銷毀不再被module所使用的資源。
void Init(HttpApplication context); 參數:HttpApplication類型的執行個體傳回值:void 作用:初始化一個module,為捕獲HTTP請求做出一些準備。
瞭解了介面IhttpModule的方法,我們也就知道了如何去實現它了。接下來,我們來開始我們自己的HttpModule構建曆程吧。
1) 開啟VS.NET建立一個“Class Library”項目,將它命名為MyHttpModule。
2) 引用System.Web.dll檔案在代碼地區敲入:
using System;
using System.Web;
namespace MyHttpModuleTest
{ /**////
/// 說明:用來實現自訂HttpModule的類
/// 作者:uestc95
/// 聯絡:uestc95@263.net
///
public class MyHttpModule:IHttpModule
{
/**////
/// 說明:構造器方法
/// 作者:uestc95
/// 聯絡:uestc95@263.net
///
public MyHttpModule() { }
/**////
/// 說明:實現IHttpModule介面的Init方法
/// 作者:uestc95
/// 聯絡:uestc95@263.net
///
/// HttpApplication類型的參數
public void Init(HttpApplication application) {
application.BeginRequest +=new EventHandler(this.Application_BeginRequest); application.EndRequest +=new EventHandler(this.Application_EndRequest);
}
/**////
/// 說明:自己定義的用來做點事情的私人方法
/// 作者:uestc95
/// 聯絡:uestc95@263.net
///
/// 傳遞進來的對象參數
/// 事件參數
private void Application_BeginRequest(Object obj,EventArgs e)
{
//聲明HttpApplication
HttpApplication application=(HttpApplicationobj;
HttpContext context=application.Context; HttpResponse response=context.Response;
HttpRequest request=context.Request; response.Write("我來自Application_BeginRequest,:)");
}
/**////
/// 說明:自己定義的用來做點事情的私人方法
/// 作者:uestc95
/// 聯絡:uestc95@263.net
///
/// 傳遞進來的對象參數
/// 事件參數
private void Application_EndRequest(Object obj,EventArgs e)
{ HttpApplication application=(HttpApplication)obj;
HttpContext context=application.Context; HttpResponse response=context.Response; HttpRequest request=context.Request; response.Write("我來自Application_EndRequest,:)"); }
/**//// /// 說明:實現IHttpModule介面的Dispose方法/// 作者:uestc95 /// 聯絡:uestc95@263.net /// public void Dispose(){}