熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP.NET HTTP運行時組成詳解(上)

2013-11-13 12:22:41  來源: .NET編程 

  不管使用哪種底層平台可靠性和性能都是對所有 Web 應用程序的主要要求盡管從某種意義上講這兩個要求是相互矛盾的例如要構建更可靠更健壯的應用程序可能需要將 Web 服務器與具體的應用程序分離使應用程序在進程外工作但是如果在不同於 Web 服務器進程的內存環境中工作應用程序將變慢因此需要采取合理的措施以確保進程外代碼盡可能快地運行

  在構建 Microsoft? ASPNET 運行時環境時依據的設計原則即充分考慮可靠性和性能得到的 ASPNET 進程模型包含了兩個系統元素 一個存在於 Web 服務器進程中的進程內連接器一個外部的輔助進程另外ASPNET 運行時結構的可伸縮能力很強可以自動使用多處理器硬件中任意選定的處理器這種模式被稱為Web Garden它可以使多個輔助進程同時運行而且各個進程均在獨立的處理器中

  高度概括起來ASPNET 運行時具有三大屬性

  應用程序和 ASPNET 輔助進程之間完全分離提供服務的輔助進程的壽命決不會影響應用程序的壽命換句話說當應用程序啟動並處於運行狀態時輔助進程可以隨時終止

  盡管 ASPNET 應用程序從不在 Web 服務器內采用進程內的方式運行但大多數情況下其總體性能仍接近於進程內應用程序的性能

  為 Web Garden 體系結構提供了內置的和可配置的支持只要簡單檢查一下配置文件中的設置輔助進程就可以克隆自己以利用所有與進程密切相關的 CPU因此在大多數情況下您在具備多處理器的計算機中獲得的可縮放性將呈線性增長的趨勢(本文後面將詳細介紹此內容

  本文將介紹 ASPNET 運行時環境的組成元素然後一步一步地講述從 URL 請求變為純 HTML 文本的漫長而曲折的過程

  除非另有說明否則以下介紹中均指 ASPNET 的默認進程模型即 Microsoft? Internet Information Services (IIS) x 中唯一的模型

  ASPNET 結構的組件

  執行 ASPNET 應用程序需要宿主 Web 服務器的支持在 Microsoft? Windows? 的 Server 平台中Web 服務器由名為 inetinfoexe 的 IIS 可執行文件表示Windows 及以上版本的操作系統本身均提供了 Web 服務器但需要注意在 Microsoft? Windows Server&#; 並未默認安裝 IIS 和 ASPNET必須通過單擊控制面板中的添加或刪除程序小程序將其添加到系統中

  IIS 是一個未托管的可執行程序它提供了一個基於 ISAPI 擴展模塊和篩選器模塊的可擴展模型通過編寫此類模塊開發人員可以直接管理對特定資源類型的請求並在各個預定義的步驟中接收當前請求擴展和篩選器是一些 DLL可以導出一些具有已知名稱和簽名的函數這些插件組件是在 IIS 配置數據庫中注冊並配置的
 
  只有少數幾種被客戶端請求的資源類型由 IIS 直接處理例如對 HTML 頁面文本文件JPEG 和 GIF 圖像的傳入請求由 IIS 處理對 Active Server Page (*asp) 文件的請求通過調用名為 aspdll 的 ASP 專用擴展模塊進行解析同樣對 ASPNET 資源(例如*aspx*asmx*ashx)的請求將傳遞到 ASPNET ISAPI 擴展該系統組件是一個名為 aspnet_isapidll 的 Win DLLASPNET 擴展可以處理多種資源類型包括 Web 服務和 HTTP 處理程序調用

  ASPNET ISAPI 擴展是一個 Win DLL未集成托管代碼它是接收和分派對各種 ASPNET 資源的請求的控制中心按照設計該模塊存在於 IIS 進程中在具有管理員權限的 SYSTEM 帳戶下運行開發人員和系統管理員不能修改此帳戶ASPNET ISAPI 擴展負責調用 ASPNET 輔助進程 (aspnet_wpexe)而該進程又負責控制請求的執行除了對請求進行安排以外ASPNET ISAPI 還監視輔助進程的運行情況並在性能降低到一定程度時將進程取消

  輔助進程是一小段 Win shell 代碼集成了公共語言運行庫 (CLR) 並運行托管代碼它負責處理對 ASPXASMX 和 ASHX 資源的請求一般來說此進程在一台給定的計算機中只有一個實例所有當前激活的 ASPNET 應用程序均在其中運行每個應用程序都位於一個獨立的 AppDomain 中但是如前所述輔助進程支持 Web Garden 模式即進程的相同副本都運行在與進程密切相關的 CPU 中(更多內容請參閱本文後面的Web Garden 模型部分

  ISAPI 和輔助進程之間的通訊是使用一組命名管道進行的命名管道是一種 Win 機制用於跨進程邊界傳輸數據顧名思義命名管道的工作方式與管道相似在一端輸入數據在另一端輸出相同的數據建立的管道既可以連接本地進程也可以連接遠程計算機上運行的進程對於本地進程間通訊管道是 Windows 中的最有效最靈活的工具

  為確保獲得最優性能aspnet_isapi 使用異步命名管道來將請求轉發給輔助進程並獲得響應另一方面輔助進程在需要查詢有關 IIS 環境的信息(即服務器變量)時又使用同步管道aspnet_isapi 模塊創建固定數量的命名管道並使用重疊的操作以通過小的線程池處理同一時間進行的連接當通過管道進行的數據交換操作結束後完成例程將斷開客戶端並重新使用管道實例為新的客戶端服務線程池和重疊操作均可以保證使 ASPNET ISAPI 的性能達到令人滿意的水平但是aspnet_isapi 擴展決不會處理 HTTP 請求

  ASPNET 請求的處理邏輯可以概括為以下步驟

  當請求到達時IIS 檢查資源類型並調用 ASPNET ISAPI 擴展如果啟用了默認的進程模型aspnet_isapi 會將請求排隊並將請求分配給輔助進程所有的請求數據都通過異步 I/O 發送如果啟用了 IIS 進程模型請求將自動在輔助進程 (wwpexe) 中排隊此輔助進程用於處理應用程序所屬的 IIS 應用程序池IIS 輔助進程不了解 ASPNET 和托管代碼的任何情況它只是處理 *aspx 擴展並加載 aspnet_isapi 模塊當 ASPNET ISAPI 在 IIS 進程模型中運行時它的工作方式有所不同僅在 wwpexe 輔助進程的上下文中加載 CLR

  收到請求後ASPNET 輔助進程將通知 ASPNET ISAPI它將為請求服務通知通過同步 I/O 實現之所以使用同步模型是因為請求只有在 ISAPI 內部請求表中被標記為executing輔助進程才能開始處理它如果請求已經由特殊的輔助進程進行處理則不能再將它指定到其他進程除非原始進程已取消
在輔助進程的上下文中執行請求有時輔助進程可能需要回調 ISAPI 以完成請求也就是需要說枚舉服務器變量這種情況下輔助進程將使用同步管道因為這樣可以保持請求處理邏輯的順序

  完成後響應被發送到打開了異步管道的 aspnet_isapi現在請求的狀態變為Done之後將從請求表中被刪除如果輔助進程崩潰正在處理的所有請求仍將保持executing狀態並持續一段時間如果 aspnet_isapi 檢測到輔助進程已取消它將自動終止請求並釋放所有相關的 IIS 資源

  以上說明是指默認的 ASPNET 進程模型即在 IIS x 中運行的工作模型IIS (Windows Server 提供)的默認工作方式對 ASPNET 進程模型也有影響當集成在 IIS 中時ASPNET 會自動調整自己的工作方式以適應宿主環境這時不再需要使用 aspnet_wp 輔助進程machineconfig 文件中定義的某些配置參數也被忽略從 ASPNET 的角度來看IIS 的最大改變是有關請求的一切都在 aspnet_isapi 的控制之下且都處在 wwpexe 輔助進程的上下文中輔助進程的帳戶是為 Web 應用程序所屬的應用程序池設置的帳戶默認情況下該帳戶是 NETWORKSERVICE&#它是一個內置的弱帳戶在功能上與 ASPNET 等價

  輔助進程受一個名為進程回收 (Recycling) 的功能的控制進程回收具有 aspnet_isapi 功能當現有進程消耗的內存太多響應太慢或掛起時可以自動啟動新進程出現這種情況時新請求將由新實例處理新實例從而變成新的活動進程但是指定給舊進程的所有請求仍保持掛起狀態如果舊進程結束了掛起的請求並進入空閒狀態該進程即終止如果輔助進程崩潰或者由於其他原因停止處理請求則所有掛起的請求將被重新指定給新進程

  盡管 ASPNET ISAPI 和輔助進程是 ASPNET 運行時結構的主要組成部分但還有其他一些可執行文件也發揮著作用下表列出了所有這些組件

  表 構成 ASPNET 運行時環境的可執行文件

 名稱  類型  帳戶  aspnet_isapidll  Win DLL(ISAPI 擴展)  LOCAL SYSTEM   aspnet_wpexe  Win  EXE ASPNET  aspnet_filterdll   Win DLL(ISAPI 篩選器)  LOCAL SYSTEM   aspnet_stateexe  Win NT Service ASPNET  

  aspnet_filterdll 組件是一個小的 Win ISAPI 篩選器用來備份 ASPNET 應用程序的無 Cookie 會話狀態在 Windows Server 當啟用 IIS 進程模型時aspnet_filterdll 還將篩選出 Bin 目錄中對非可執行資源的請求

  aspnet_stateexe 的作用對 Web 應用程序更為重要因為它用於管理會話狀態該項服務是可選的可以用來在 Web 應用程序內存空間之外保存會話狀態數據該可執行文件是一種 NT 服務既可以在本地運行也可以遠程運行當該服務被激活後可以將 ASPNET 應用程序配置為將所有會話信息保存在此進程的內存中一種類似的方案是提供更為可靠的數據存儲方式不受進程回收和 ASPNET 應用程序故障的影響該服務在 ASPNET 本地帳戶下運行但可以使用服務控制管理器 (Service Control Manager) 接口來配置它

  另一個應該介紹的可執行文件是 aspnet_regiisexe盡管嚴格來講它並不屬於 ASPNET 運行時結構該實用程序可以用來配置環境以在一台計算機上並行執行不同版本的 ASPNET還可用於維修 IIS 和 ASPNET 損壞的配置該實用程序的工作方式是更新存儲在 IIS 配置數據庫的根目錄和子目錄中的腳本映射腳本映射是資源類型和 ASPNET 模塊之間的一種關聯關系最後還可以使用該工具來顯示已安裝的 ASPNET 版本的狀態執行其他配置操作如授予對特定文件夾的 NTFS 權限創建客戶腳本目錄

  Web Garden 模型

  Web Garden 模型可以通過 machineconfig 文件中的 <processModel> 部分進行配置請注意<processModel> 部分是唯一不能放在應用程序特定的 webconfig 文件中的配置部分這就是說Web Garden 模式可以應用到計算機中運行的所有應用程序但通過使用 machineconfig 源文件中的 <location> 節點可以針對各個應用程序調節計算機的設置

  <processModel> 部分有兩個屬性可以影響 Web Garden 模型它們是 webGarden 和 cpuMaskwebGarden 屬性接受布爾值表示是否使用了多個輔助進程(一個相關的 CPU 對應一個進程)默認情況下該屬性的值為 falsecpuMask 屬性保存一個 DWORD 值該值的二進制表示為能夠運行 ASPNET 輔助進程的 CPU 提供了位屏蔽其默認值為 (xFFFFFF)表示可以使用所有可用的 CPU如果 webGarden 屬性為 false則 cpuMask 屬性的內容將被忽略cpuMask 屬性還為正在運行的 aspnet_wpexe 的副本數設置了上限

  常言道閃光的不都是金子用在這裡很合適Web Garden 模式使得多個輔助進程可以同時運行但是需要注意的是所有進程都會有自己的應用程序狀態進程內會話狀態ASPNET 緩存靜態數據以及運行應用程序所需的其他內容啟用 Web Garden 模式之後ASPNET ISAPI 將根據 CPU 的數量盡可能多地啟動輔助進程每個輔助進程都是下一進程的完整克隆(每一進程都與相應的 CPU 密切相關)為平衡工作負荷傳入的請求以單循環的方式在運行的進程之間進行劃分輔助進程就象在單處理器中一樣被回收請注意ASPNET 繼承了操作系統中所有的 CPU 使用限制並且不包括實現限制的自定義語義

  總之Web Garden 模型並不適用於所有應用程序應用程序的狀態越多其的性能損失也越多工作數據存儲在共享內存的塊中以便一個進程輸入的變化可以立即被其他進程得知但是處理請求時工作數據被復制到進程的上下文中因此各個輔助進程將處理自己的工作數據而應用程序的狀態越多性能損失就越大鑒於此仔細明智的應用程序基准測試是絕對必要的

  只有重啟 IIS 後對配置文件中 <processModel> 部分所做的更改才會生效在 IIS Web Garden 模式的參數保存在 IIS 配置數據庫中webGarden 和 cpuMask 屬性被忽略


From:http://tw.wingwit.com/Article/program/net/201311/15777.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.