Asp.Net運行時對象生成過程以及HttpHandler和HttpModule的處理過程。

現在敘述最終要的過程,當asp.net在IIS的ISAPI獲取一個aspx的系統請求,並獲得控制權後發生了什麼。

首先,它檢測內存中是否有負責處理asp.net內容的運行庫進程(IIS5是aspnet_wp.exe,IIS6是w3wp.exe),如果沒有就創建一個,然後把控制權轉給這個進程(就是函數指針跳轉操作)。

當這個進程接到控制權後,檢查進程裏面的此站點的應用程序設置的應用程序域裏面是否有HttpRuntime類的實例,沒有就新建一個實例。一個服務器內可以有多個HttpRuntime類的實例,原因是一個服務器的IIS可能建立多個站點,而每個站點可能新建多個虛擬目錄。但是每個站點僅能新建一個HttpRuntime類的實例,防止佔用系統資源過多。

HttpRuntime就是asp.net的運行庫程序的基礎了。他負責控制每個站點/虛擬目錄的asp.net請求(注意不是Http請求),但是它不負責處理請求。HttRuntime對象控制的是HttpApplicationFactory對象,它是一個類工廠對象,負責生成類的。

HttpApplicationFactory類負責控制一個對象池,對象池裏面的對象就是我們經常使用的HttpApplication對象。
首先,HttpApplicationFactory負責處理global.ascx程序,並且觸發Application_OnStart事件,然後從池中獲取一個 HttpApplication 實例,並將要處理的請求放入實例中。如果沒有可用的對象,則創建一個新的 HttpApplication 對象。要創建 HttpApplication 對象,需要先完成 global.asax 應用程序文件的編譯。然後HttpApplication 開始處理請求,並且只能在完成這個請求後才能處理新的請求。如果收到來自同一資源的新請求,則由池中的其他對象來處理,就是說,如果一個站點有許多用戶,那麼多個用戶的多個請求將由不同的HttpApplication來處理。

應用程序對象允許所有註冊的 HTTP 模塊對請求進行預處理(注意,這就是HttpModule開始工作了),並找出最適合處理請求的處理程序類型。這通過查找請求的 URL 的擴展和配置文件中的信息來完成。

所以說,最終處理asp.net頁的是一個名叫HttpApplication的類實例。按照上面的步驟就可以得出:當HttpRuntime啓動HttpApplicationFactory的時候,首先啓動的是asp.net自己的事件預處理程序global.ascx,然後才輪到HttpApplication。

aspx的處理定義系統怎麼知道的?答案就是從machie.config配置文件獲取的。這個文件定義了所有的.aspx,.ashx,.asmx,.ascx等文件的處理程序。

結論:處理流程ISAPI --> aspnet_wp.exe/w3wp.exe --> HttpRuntime -->HttpApplicationFactory --> HttpApplication --> 內容Html

那麼,我們是否可以自定義過程處理?可以的,方法就是貼主問的HttpModule(Http模塊)和HttpHandle(Http處理器)的作用。

HttpModule就是在HttpApplication處理之前由HttpApplicationFactory運行的global.ascx的事件處理程序的自定義版,它可以讓你自己寫一個繼承IHttpModule接口的類來代替asp.net來處理某個aspx頁,甚至所有的aspx頁,而不由asp.net幫助你處理。
而HttpHandler是經過global.ascx處理後所進行內容處理的HttpApplication的代替版,就是說你可以自己寫一個類,繼承IHttpHandler,來代替HttpApplication來處理某個aspx,或者所有的aspx,你可以隨心所欲的來處理aspx的任何內容。不過所有的內容處理必須要你自己寫代碼來處理了,非常方便。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章