ASP.NET HTTP運行時組成詳解(4)
發表于:2007-06-30來源:作者:點擊數:
標簽:
HTTP 管道 ASP .net ISAPI 擴展啟動輔助進程后,它將傳遞部分命令行參數。輔助進程使用這些參數來執行加載 CLR 前需要執行的任務。傳遞的值包括:COM 和 DCOM 安全 性所要求的身份驗證等級、可以使用的命名管道的數量和 IIS 進程標識。命名管道的名稱是使用
HTTP 管道
ASP
.net ISAPI 擴展啟動輔助進程后,它將傳遞部分命令行參數。輔助進程使用這些參數來執行加載 CLR 前需要執行的任務。傳遞的值包括:COM 和 DCOM
安全性所要求的身份驗證等級、可以使用的命名管道的數量和 IIS 進程標識。命名管道的名稱是使用 IIS 進程標識和允許的管道數隨機生成的。輔助進程不接收可用管道的名稱,但可以接收識別管道名稱所需的信息。
COM 和 DCOM 安全性與 Microsoft? .NET Framework 有何關系?實際上,CLR 是作為 COM 對象提供的。更準確地說,CLR 本身不是由 COM 代碼構成的,但是指向 CLR 的接口卻是一個 COM 對象。因此,輔助進程加載 CLR 的方式與加載 COM 對象的方式相同。
當 ASPX 請求遇到 IIS 時,Web
服務器將根據選擇的身份驗證模型(匿名、
Windows、Basic 或 Digest)來分配一個令牌。當輔助進程收到要處理的請求時,令牌被傳遞到輔助進程。請求由輔助進程中的線程獲取。該線程從最初獲取傳入請求的 IIS 線程繼承身份令牌。在 aspnet_wp.exe 中,負責處理請求的實際帳戶取決于在特殊的 ASP.NET 應用程序中是如何配置模擬的。如果模擬被禁用(默認設置),則線程將在輔助進程的帳戶下運行。默認情況下,該帳戶在 ASP.NET 進程模型中為 ASPNET,在 IIS 6 進程模型中為 NETWORKSERVICE。這兩個帳戶都是“弱”帳戶,提供的功能比較有限,可以有效抵擋回復性攻擊 (Revert-to-self Attack)。(回復性攻擊是指將模擬的客戶端的安全性令牌回復到父進程令牌。為輔助進程分配弱帳戶可以挫敗此類攻擊。)
高度概括起來,ASP.NET 輔助進程完成的一項主要任務就是將請求交給一系列稱為的 HTTP 管道的托管對象。要激活 HTTP 管道,可以創建一個 HttpRuntime 類的新實例,然后調用其 ProcessRequest 方法。如前所述,ASP.NET 中始終只運行一個輔助進程(除非啟用了 Web Garden 模型),該進程在獨立的 AppDomain 中管理所有的 Web 應用程序。每個 AppDomain 都有自己的 HttpRuntime 類實例,即管道中的輸入點。HttpRuntime 對象初始化一系列有助于實現請求的內部對象。Helper 對象包括緩存管理器(Cache 對象)和內部文件系統監視器(用于檢測構成應用程序的源文件的更改)。HttpRuntime 為請求創建上下文,并用與請求相關的 HTTP 信息填充上下文。上下文用 HttpContext 類的實例來表示。
另一個在 HTTP 運行時的設置初期創建的 Helper 對象是文本書寫器,用于包含瀏覽器的響應文本。文本書寫器是 HttpWriter 類的實例,此對象對頁面代碼以編程方式發送的文本進行緩存。HTTP 運行時被初始化后,它將查找實現請求的應用程序對象。應用程序對象是 HttpApplication 類的實例,該類就是 global.asax 文件背后的類。global.asax 在編程時是可選的,但在構建結構時是必需的。因此,如果應用程序中沒有構建類,則必須使用默認對象。ASP.NET 運行時包括幾個中間工廠類,可以用來查找并返回有效的 Handler 對象以處理請求。整個過程中用到的第一個工廠類是 HttpApplicationFactory。它的主要任務是使用 URL 信息來查找 URL 虛擬目錄和匯集的 HttpApplication 對象之間的匹配關系。
應用程序工廠類的行為可以概括為以下幾點:
工廠類維護 HttpApplication 對象池,并使用它們來處理應用程序的請求。池的壽命與應用程序的壽命相同。
應用程序的第一個請求到達時,工廠類提取有關應用程序類型的信息(global.asax 類)、設置用于監視更改的文件、創建應用程序狀態并觸發 Application_OnStart 事件。
工廠類從池中獲取一個 HttpApplication 實例,并將要處理的請求放入實例中。如果沒有可用的對象,則創建一個新的 HttpApplication 對象。要創建 HttpApplication 對象,需要先完成 global.asax 應用程序文件的編譯。
HttpApplication 開始處理請求,并且只能在完成這個請求后才能處理新的請求。如果收到來自同一資源的新請求,則由池中的其他對象來處理。
應用程序對象允許所有注冊的 HTTP 模塊對請求進行預處理,并找出最適合處理請求的處理程序類型。這通過查找請求的 URL 的擴展和配置文件中的信息來完成。
HTTP 處理程序是一些實現 IHttpHandler 接口的類。.NET Framework 為常見的資源類型提供了一些預定義的處理程序,包括 ASPX 頁面和 Web 服務。machine.config 文件中的 <httpHandlers> 部分定義了 HttpApplication 對象必須實例化才能處理特定類型資源的請求的類名。如果 Helper 類是一個處理程序工廠,GetHandler 方法將確定要使用的處理程序類型。這時,將從一組類似的對象中獲取適當類型的處理程序,并對其進行配置以處理請求。
IHttpHandler 接口提供了兩個方法:IsReusable 和 ProcessRequest。前者將返回一個布爾值,表示處理程序是否可以被匯集。(大多數預定義的處理程序都是匯集的,但是您可以自行定義每次都需要新實例的處理程序。)ProcessRequest 方法包含處理特定類型資源所需的所有邏輯。例如,ASPX 頁面的處理程序基于以下偽代碼:
private void ProcessRequest()
{
// 確定請求是否是回發 (postback)
IsPostBack = DeterminePostBackMode();
// 觸發 ASPX 源代碼的 Page_Init 事件
PageInit();
// 加載 ViewState,處理已發送的值。
if (IsPostBack) {
LoadPageViewState();
ProcessPostData();
}
// 觸發 ASPX 源代碼的 Page_Load 事件
PageLoad();
// 1) 再次處理已發送的值(當
// 動態創建控件時)
// 2) 將屬性更改的服務器端事件提升為輸入驅動的
// 控件(即復選框的狀態改變)
// 3) 執行與回發事件相關的所有代碼
if (IsPostBack) {
ProcessPostDataSecondTry();
RaiseChangedEvents();
RaisePostBackEvent();
}
// 觸發 ASPX 源代碼的 Page_PreRender 事件
PreRender();
// 將控件的當前狀態保存到 ViewState 中
SavePageViewState();
// 將頁面內容呈現給 HTML
RenderControl(CreateHtmlTextWriter(Response.Output));
}
無論調用的資源類型如何,基于 HTTP 處理程序的模型是相同的。唯一隨資源類型變化而變化的元素是處理程序。HttpApplication 對象負責查找應該使用哪種處理程序來處理請求。HttpApplication 對象還負責檢測對動態創建的、表示資源的程序集(如 .aspx 頁面或 .asmx Web 服務)所進行的更改。如果檢測到更改,應用程序對象將確保編譯并加載所請求的資源的最新來源。
原文轉自:http://www.kjueaiud.com