ASP.NET Framework深度曆險(2)

來源:互聯網
上載者:User
ASP.NET Framework深度曆險(2)March 25,2004
.NET Framework Version:1.0.3705正式版
VS.NET(C#) Version:7.0.9466正式版

    剛剛吃完晚飯,正好在鍵盤上面鍛煉一下手指。
    接著上回繼續寫這個“日記”:
   
    Chapter Two -- HttpModule是如何工作的?

    我們上回說到,一個來自於用戶端的Http Request被截獲後經過層層轉交(怎麼都在踢皮球?呵呵)到達了HttpModule這個“請求監聽器”。
HttpModule就類似於安插在ASPNET_WP.EXE進程中的一個***,稍微有些常識的人都會很自然的想象得到***是用來做什麼的,而我們的HttpModule
可以說是作***的絕好人選了,但是需要明確的是,HttpModule絕對不是簡單的監聽器,它可以做到更多的東西,比如它可以對截獲的請求增加一些內容
等等。
     另外需要明白的是,當一個Http Request到達HttpModule的時候,整個ASP.NET Framework系統還並沒有對這個請求做任何的真正處理,但是我們可以
在這個Http Request傳遞到真正的請求處理中心(HttpHandler)之前附加一些我們需要的資訊在這個Http Request至上,或者針對我們截獲的這個Http
Request資訊作一些額外的工作,或者在某些情況下乾脆終止滿足一些條件的Http Request,從而可以起到一個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構建曆程吧。
     1)開啟VS.NET建立一個“Class Library”項目,將它命名為MyHttpModule。
     2)引用System.Web.dll檔案

     在代碼地區敲入:

using System;
using System.Web;

namespace MyHttpModuleTest
{
    /// <summary>
    /// 說明:用來實現自訂HttpModule的類
    /// 作者:uestc95
    /// 聯絡:uestc95@263.net
    /// </summary>
    public class MyHttpModule:IHttpModule
    {
        /// <summary>
        /// 說明:構造器方法
        /// 作者:uestc95
        /// 聯絡:uestc95@263.net
        /// </summary>
        public MyHttpModule()
        {
            
        }

        /// <summary>
        /// 說明:實現IHttpModule介面的Init方法
        /// 作者:uestc95
        /// 聯絡:uestc95@263.net
        /// </summary>
        /// <param name="application">HttpApplication類型的參數</param>
        public void Init(HttpApplication application)
        {
            application.BeginRequest +=new EventHandler(this.Application_BeginRequest);
            application.EndRequest +=new EventHandler(this.Application_EndRequest);
        }

        /// <summary>
        /// 說明:自己定義的用來做點事情的私人方法
        /// 作者:uestc95
        /// 聯絡:uestc95@263.net
        /// </summary>
        /// <param name="obj">傳遞進來的對象參數</param>
        /// <param name="e">事件參數</param>
        private void Application_BeginRequest(Object obj,EventArgs e)
        {
            HttpApplication application=(HttpApplication)obj;
            HttpContext context=application.Context;
            HttpResponse response=context.Response;
            HttpRequest request=context.Request;

            response.Write("我來自Application_BeginRequest,:)");
            
        }

        /// <summary>
        /// 說明:自己定義的用來做點事情的私人方法
        /// 作者:uestc95
        /// 聯絡:uestc95@263.net
        /// </summary>
        /// <param name="obj">傳遞進來的對象參數</param>
        /// <param name="e">事件參數</param>
        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,:)");
            
        }

        /// <summary>
        /// 說明:實現IHttpModule介面的Dispose方法
        /// 作者:uestc95
        /// 聯絡:uestc95@263.net
        /// </summary>
        public void Dispose(){}
    }
}

     3)在VS.NET中編譯之後,你會得到MyHttpModule.dll這個檔案。
     4)接下來我們的工作就是如何讓ASPNET_WP.exe進程將http request交給我們自己寫的這個HttpModule呢?方法就是配置web.config檔案。
     在web.config檔案中增加如下幾句話:
        <httpModules>
            <add name="test" type="MyHttpModuleTest.MyHttpModule,MyHttpModule"/>
        </httpModules>
      注意要區分大小寫,因為web.config作為一個XML檔案是大小寫敏感的。“type=MyHttpModuleTest.MyHttpModule,MyHttpModule”告訴我們
      系統將會將http request請求交給位於MyHttpModule.dll檔案中的MyHttpModuleTest.MyHttpModule類去處理。而這個DLL檔案系統將會自動
      到bin子目錄或者系統全域程式集緩衝區(GAC)搜尋。我們可以將我們剛才得到的DLL檔案放在bin子目錄中,至於後者,你可以通過.NET SDK正式版
      內建的Config工具做到,我們不詳細說了。

      好了,我們的用來截獲http request請求的HttpModule就完成並且裝配完成了,你可以試著在你的web項目中建立一個新的WebForm,運行看看呢?:)
      最後,我們假設一個使用這個HttpModule的場合。A網站提供免費的ASP.NET虛擬空間給大家,但是A網站的管理者並不想提供免費的午餐,他想要在每一個
      頁面被瀏覽的時候自動彈出自己公司的廣告(就像現在的www.X63.com一樣),我總不能時刻監視所有使用者的所有頁面吧,並且想要在每一個頁面手動添加
      一段JS代碼,工作量是不可想象的,也是不現實的。那末好了,只要我們的HttpModule一旦被掛接完成,這一切都將是輕而易舉事情了,只要我們在每一個
      Http Request被我們捕獲的時候,給他增加上一些JS就好了!

      我們上面提到在Init()方法中使用了兩個事件BeginRequest和EndRequest,這兩個事件分別是Init()中可以處理的所有事件的最開始事件和最終事件,在他們
      中間還有一些其它的事件可以被我們利用,可以查閱MSDN。

      另外在我關閉EditPlus之前,需要敲下如下的話:
      在HttpModule中可以正常使用Response,Request,Server,Application,但是不能操作任何與Session有關代碼!
      為什麼呢?自己考慮一下吧,下回看看原因在哪裡,另外再給出一個問題,你能發現系統預設的那幾個HttpModule在哪裡配置的呢?找找看。
      
      下回我們看看HttpHandler部分以及如何同HttpModule相配合的東東。

      See you later.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.