當一個HTTP請求到伺服器並被IIS接收到之後,IIS首先通過用戶端請求的頁面類型為其載入相應的.dll檔案,然後在處理過程中將這條請求發送給能夠處理這個請求的模組。在ASP.NET 3.5中,這個模組叫做HttpHandler(HTTP處理常式組件),之所以.aspx檔案可以被伺服器處理,就是因為在伺服器端有預設的HttpHandler專門處理.aspx檔案。IIS在將這條請求發送給能夠處理這個請求的模組之前,還需要經過一些HttpModule的處理,這些都是系統預設的Modules(用於擷取當前應用程式的模組集合),在這個HTTP請求傳到HttpHandler之前要經過不同的HttpModule的處理。這樣做的好處,一是為了一些必需的過程,二是為了安全性,三是為了提高效率,四是為了使用者能夠在更多的環節上進行控制,增強使用者的控制能力。ASP.NET 3.5運行原理1.1所示。
說明:HttpModule模組是一個組件,可以註冊為ASP.NET 3.5請求生命週期的一部分,當處理該組件時,該組件可以讀取或變更要求或響應。HttpModule模組通常用於執行需要監視每個請求的特殊任務,如安全或網站統計資訊。
(PS:
HttpModule 概述:
暫時先不考慮我們自己實現Http Module的情況。在.Net中,Http Module 是實現了IHttpModule介面的程式集。IHttpModule 介面本身並沒有什麼好大寫特寫的,由它的名字可以出,它不過是一個普普通通的介面而已。實際上,我們關心的是實現了這些介面的類,如果我們也編寫代碼實現了這個介面,那麼有什麼用途。一般來說,我們可以將Asp.Net中的事件分成三個層級,最頂層是 應用程式級事件、其次是頁面級事件、最下面是控制項級事件,事件的觸發分別與 應用程式周期、頁面周期、控制項周期緊密相關。而 Http Module 的作用是與應用程式事件 密切相關的。
我們通過Http Module在Http請求管道(Pipeline)中註冊期望對應用程式事件做出反應的方法,在相應的事件觸發的時候(比如說BeginRequest事件,它在應用程式收到一個Http請求並即將對其進行處理時觸發),便會調用Http Module註冊了的方法,實際的工作在這些方法中執行。.Net 本身已經有很多的Http Module,其中包括 表單驗證Module(FormsAuthenticationModule), Session 狀態Module(SessionStateModule),輸出緩衝Module (OutputCacheModule)等。
更多瞭解:http://www.cnblogs.com/jimmyzhang/archive/2007/11/25/971878.html
)
ASP.NET 3.5運行機制1.2所示。
通常情況下,ASP.NET架構搭建在Windows Server(伺服器版作業系統)+IIS(Web伺服器,是Internet資訊服務管理器的英文縮寫)環境中,在安裝.NET Framework時,安裝程式將會在IIS中註冊ASP.NET所需的ISAPI擴充(aspnet_isapi.dll),這就使得作為ASP.NET宿主的IIS在接收到用戶端的HTTP請求後,將響應請求的控制權交給ASP.NET運行。
ASP.NET運行時接收到請求後,會判斷網站是否為第一次被訪問,如果是第一次訪問,則運行初始化工作(如載入Bin目錄中的DLL動態連結程式庫,讀取Web.Config網站設定檔,初始化HttpApplication執行個體,編譯和載入Global.asax檔案等)。ASP.NET運行時還負責建立請求響應線程的HttpContext上下文執行個體和建立承載響應結果的HttpTextWriter執行個體。然後,ASP.NET運行時尋找合適的HttpHandler(通常就是具有的ASP.NET頁面)處理HTTP請求,並等HttpHandler返回請求處理結果。最後,ASP.NET運行時在完成一些後續工作之後,如儲存Session、異常處理,再通過IIS把響應結構返回給用戶端。
注意:ASP.NET ISAPI工作的主要任務就是安排ASPNET_WP.exe處理請求,並監視ASPNET_ WP.exe進程的執行情況,如果ASPNET_WP.exe進程不能完成任務,ASP.NET ISAPI就安排一個新的ASPNET_WP.exe來處理工作。ASPNET_WP.exe的主要任務是將請求交給一系列稱為HTTP管道的託管對象。如果把ASP.NET ISAPI比做銷售商,那麼ASPNET_WP.exe就是生產商,而HTTP管道就是生產的流水線,負責流水線的小組就是HttpRuntime。生產商ASPNET_WP.exe會將訂單(HTTP請求)交給HttpRuntime小組的工作人員ProcessRequest(HttpWorkerRequest wr),HttpRuntime根據內部的分工,最終由ProcessRequestInternal(HttpWorkerRequest wr)在流水線上進行生產。
轉自:http://book.51cto.com/art/201001/181147.htm