學習《ASP.NET Framework深度曆險》(2)

來源:互聯網
上載者:User

這幾天一直在忙期末考試,都沒時間來看看書了。

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(){} 
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.