深入瞭解ASP.NET運行內幕

來源:互聯網
上載者:User

做事情要知道根本所在,原理所在,寫程式更應該知道程式的運行機制,本文主要介紹 asp.net的運行內幕
HttpApplication觸發事件來通知你的程式有事發生,以此來負責請求流轉.這作為HttpApplication.Init()函數的一部分發生(用Reflector查看System.Web.HttpApplication.InitInternal()方法和HttpApplication.ResumeSteps()方法來瞭解更多詳情),連續設定並啟動一系列事件,包括執行所有的處理器(handler).這些事件處理器映射到global.asax中自動產生的哪些事件中,同時它們也映射到所有附加的HttpModule(它們本質上是HttpApplication對外發布的額外的事件接收器(sink)).

HttpModule和HttpHandler兩者都是根據Web.config中對應的配置被動態載入並附加到事件處理鏈中.HttpModule實際上是事件處理器,附加到特殊的HttpApplication事件上,然而HttpHandler是用來處理”應用級請求處理”的終點.

HttpModule和HttpHandler兩者都是在HttpApplication.Init()函數調用的一部分中被載入並附加到調用鏈上.圖6顯示了不同的事件,它們是何時發生的以及它們影響管道的哪一部分.

圖6-事件在ASP.NET http管道中流轉的過程.HttpApplication對象的事件驅動請求在管道中流轉.Http Module可以攔截這些事件並覆蓋或者擴充現有的功能.

HttpContext, HttpModules 和 HttpHandlers

httpApplication它本身對發送給應用程式的資料一無所知-它只是一個通過事件來通訊的訊息對象.它觸發事件並通過HttpContext對象來向被調用函數傳遞訊息.實際的當前請求的狀態資料由前面提到的HttpContext對象維護.它提供了所有請求專有的資料並從進入管道開始到結束一直跟隨請求.圖7顯示了ASP.NET管道中的流程.注意內容物件(即HttpContext),這個從請求開始到結束一直都是你”朋友”的對象,可以在一個事件處理函數中儲存資訊並在以後的事件處理函數中取出.

一旦管道被啟動,HttpApplication開始象圖六那樣一個個的觸發事件.每個事件處理器被觸發,如果事件被掛接,這些處理器將執行它們自己的任務.這個處理的主要任務是最終調用掛接到此特定請求的HttpHandler.處理器(handler)是ASP.NET請求的核心處理機制,通常也是所有應用程式層級的代碼被執行的地方.記住ASP.NET頁面和Web服務架構都是作為HttpHandler實現,這裡也是處理請求的的核心之處.模組(module)趨向於成為一個傳遞給處理器(handler)的內容相關的預先處理或後處理器.ASP.NET中典型的預設處理器包括預先處理的認證,緩衝以及後處理中各種不同的編碼機制.

有很多關於HttpHandler和HttpModule的可用資訊,所以為了保持這篇文章在一個合理的長度,我將提供一個關於處理器的概要介紹.

HttpModule

 

當請求在管道中傳遞時,HttpApplicaion對象中一系列的事件被觸發.我們已經看到這些事件在Global.asax中作為事件被發布.這種方法是特定於應用程式的,可能並不總是你想要的.如果你要建立一個通用的可用被插入任何Web應用程式的HttpApplication事件鉤子,你可用使用HttpModule,這是可複用的,不需要特定語應用程式代碼的,只需要web.config中的一個條目.

模組本質上是過濾器(fliter)-功能上類似於ISAPI過濾器,但是它工作在ASP.NET請求層級上.模組允許為每個通過HttpApplication對象的請求掛接事件.這些模組作為外部程式集中的類存貯.,在web.config檔案中被配置,在應用程式啟動時被載入.通過實現特定的介面和方法,模組被掛接到HttpApplication事件鏈上.多個HttpModule可用被掛接在相同的事件上,事件處理的順序取決於它們在Web.config中聲明的順序.下面是在Web.config中處理器定義.

<configuration>

  <system.web>

    <httpModules>

  <add name= "BasicAuthModule"

      type="HttpHandlers.BasicAuth,WebStore" />

    </httpModules>

  </system.web>

</configuration>

注意你需要指定完整的類型名和不帶dll副檔名的程式集名.

模組允許你查看每個收到的Web請求並基於被觸發的事件執行一個動作.模組在修改請求和響應資料方面做的非常優秀,可用為特定的程式提供自訂認證或者為發生在ASP.NET中的每個請求增加其他預先處理/後處理功能.許多ASP.NET的功能,像認證和會話(Session)引擎都是作為HttpModule來實現的.

雖然HttpModule看上去很像ISAPI過濾器,它們都檢查每個通過ASP.NET應用的請求,但是它們只檢查映射到單個特定的ASP.NET應用或虛擬目錄的請求,也就是只能檢查映射到ASP.NET的請求.這樣你可以檢查所有ASPX頁面或者其他任何映射到ASP.NET的副檔名.你不能檢查標準的.HTM或者圖片檔案,除非你顯式的映射這些副檔名到ASP.NET ISAPI dll上,就像圖1中展示的那樣.一個常見的此類應用可能是使用模組來過濾特定目錄中的JPG映像內容並在最上層通過GDI+來繪製’樣品’字樣.

實現一個HTTP模組是非常簡單的:你必須實現之包含兩個函數(Init()和Dispose())的IHttpModule介面.傳進來的事件參數中包含指向HTTPApplication對象的引用,這給了你訪問HttpContext對象的能力.在這些方法上你可以掛接到HttpApplication事件上.例如,如果你想掛接AuthenticateRequest事件到一個模組上,你只需像列表5中展示的那樣做

列表5:基礎的HTTP模組是非常容易實現的

public class BasicAuthCustomModule : IHttpModule

{

    public void Init(HttpApplication application)

    {

       // *** Hook up any HttpApplication events

       application.AuthenticateRequest +=

                new EventHandler(this.OnAuthenticateRequest);

    }

    public void Dispose() { }

    public void OnAuthenticateRequest(object source, EventArgs eventArgs)

    {

       HttpApplication app = (HttpApplication) source;

       HttpContext Context = HttpContext.Current;

       … do what you have to do…                        }

}

記住你的模組訪問了HttpContext對象,從這裡可以訪問到其他ASP.NET管道中固有的對象,如請求(Request)和響應(Response),這樣你還可以接收使用者輸入的資訊等等.但是記住有些東西可能是不能訪問的,它們只有在處理鏈的後段才能被訪問.

你可以在Init()方法中掛接多個事件,這樣你可以在一個模組中實現多個不同的功能.然而,將不同的邏輯分到單獨的類中可能會更清楚的將模組進行模組化(譯註:這裡的模組化和前面的模組沒有什麼關係)在很多情況下你實現的功能可能需要你掛接多個事件-例如一個日誌過濾器可能在BeginRequest事件中記錄請求開始時間,然後在EndRequest事件中將請求結束寫入到日誌中.

注意一個HttoModule和HttpApplication事件中的重點:Response.End()或HttpApplication.CompleteRequest()會在HttpApplication和Module的事件鏈中”抄近道”.看”注意Response.End()”來獲得更多資訊.

注意Response.End()

當建立HttpModule或者在Global.asax中實現事件鉤子的時候,當你調用Response.End或 Appplication.CompleteRequest的時候要特別注意.這兩個函數都結束當前請求並停止觸發在HTTP管道中後續的事件,然後發生將控制返回到Web伺服器中.當你在處理鏈的後面有諸如記錄日誌或對內容進行操作的行為時,因為他們沒有被觸發,有可能使你上當.例如,sample中logging的例子就會失敗,因為如果調用Response.End()的話,EndRequest事件並不會被觸發.

相關文章

聯繫我們

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