ASP.NET ISAPI

iDotNetSpace發表於2009-07-31

不管使用哪種底層平臺,可靠性和效能都是對所有 Web 應用程式的主要要求,儘管從某種意義上講,這兩個要求是相互矛盾的。例如,要構建更可靠、更健壯的應用程式,可能需要將 Web 伺服器與具體的應用程式分離,使應用程式在程式外工作。但是,如果在不同於 Web 伺服器程式的記憶體環境中工作,應用程式將變慢。因此,需要採取合理的措施,以確保程式外程式碼儘可能快地執行。

在構建 Microsoft® ASP.NET 執行時環境時,依據的設計原則即:充分考慮可靠性和效能。得到的 ASP.NET 程式模型包含了兩個系統元素 - 一個存在於 Web 伺服器程式中的程式內聯結器,一個外部的輔助程式。另外,ASP.NET 執行時結構的可伸縮能力很強,可以自動使用多處理器硬體中任意選定的處理器。這種模式被稱為“Web Garden”,它可以使多個輔助程式同時執行,而且各個程式均在獨立的處理器中。

高度概括起來,ASP.NET 執行時具有三大屬性:

◆應用程式和 ASP.NET 輔助程式之間完全分離。提供服務的輔助程式的壽命決不會影響應用程式的壽命。換句話說,當應用程式啟動並處於執行狀態時,輔助程式可以隨時終止。
◆儘管 ASP.NET 應用程式從不在 Web 伺服器內採用程式內的方式執行,但大多數情況下,其總體效能仍接近於程式內應用程式的效能。
◆為 Web Garden 體系結構提供了內建的和可配置的支援。只要簡單檢查一下配置檔案中的設定,輔助程式就可以克隆自己,以利用所有與程式密切相關的 CPU。因此,在大多數情況下,您在具備多處理器的計算機中獲得的可縮放性將呈線性增長的趨勢。(本文後面將詳細介紹此內容。)

本文將介紹 ASP.NET 執行時環境的組成元素,然後一步一步地講述從 URL 請求變為純 HTML 文字的“漫長而曲折”的過程。

除非另有說明,否則以下介紹中均指 ASP.NET 的預設程式模型,即 Microsoft® Internet Information Services (IIS) 5.x 中唯一的模型。
ASP.NET 結構的元件

執行 ASP.NET 應用程式需要宿主 Web 伺服器的支援。在 Microsoft® Windows® 的 Server 平臺中,Web 伺服器由名為 inetinfo.exe 的 IIS 可執行檔案表示。Windows 2000 及以上版本的作業系統本身均提供了 Web 伺服器。但需要注意,在 Microsoft® Windows Server 2003 中,並未預設安裝 IIS 和 ASP.NET,必須通過單擊“控制皮膚”中的“新增或刪除程式”小程式將其新增到系統中。

IIS 是一個未託管的可執行程式,它提供了一個基於 ISAPI 擴充套件模組和篩選器模組的可擴充套件模型。通過編寫此類模組,開發人員可以直接管理對特定資源型別的請求,並在各個預定義的步驟中接收當前請求。擴充套件和篩選器是一些 DLL,可以匯出一些具有已知名稱和簽名的函式。這些外掛元件是在 IIS 配置資料庫中註冊並配置的。

只有少數幾種被客戶端請求的資源型別由 IIS 直接處理。例如,對 HTML 頁面、文字檔案、JPEG 和 GIF 影像的傳入請求由 IIS 處理。對 Active Server Page (*.asp) 檔案的請求通過呼叫名為 asp.dll 的 ASP 專用擴充套件模組進行解析。同樣,對 ASP.NET 資源(例如,*.aspx、*.asmx、*.ashx)的請求將傳遞到 ASP.NET ISAPI 擴充套件。該系統元件是一個名為 aspnet_isapi.dll 的 Win32 DLL。ASP.NET 擴充套件可以處理多種資源型別,包括 Web 服務和 HTTP 處理程式呼叫。

ASP.NET ISAPI 擴充套件是一個 Win32 DLL,未整合託管程式碼。它是接收和分派對各種 ASP.NET 資源的請求的控制中心。按照設計,該模組存在於 IIS 程式中,在具有管理員許可權的 SYSTEM 帳戶下執行。開發人員和系統管理員不能修改此帳戶。ASP.NET ISAPI 擴充套件負責呼叫 ASP.NET 輔助程式 (aspnet_wp.exe),而該程式又負責控制請求的執行。除了對請求進行安排以外,ASP.NET ISAPI 還監視輔助程式的執行情況,並在效能降低到一定程度時將程式取消。

輔助程式是一小段 Win32 shell 程式碼,整合了公共語言執行庫 (CLR) 並執行託管程式碼。它負責處理對 ASPX、ASMX 和 ASHX 資源的請求。一般來說,此程式在一臺給定的計算機中只有一個例項。所有當前啟用的 ASP.NET 應用程式均在其中執行,每個應用程式都位於一個獨立的 AppDomain 中。但是,如前所述,輔助程式支援 Web Garden 模式,即程式的相同副本都執行在與程式密切相關的 CPU 中。(更多內容,請參閱本文後面的“Web Garden 模型”部分。)

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

為確保獲得最優效能,aspnet_isapi 使用非同步命名管道來將請求轉發給輔助程式並獲得響應。另一方面,輔助程式在需要查詢有關 IIS 環境的資訊(即伺服器變數)時又使用同步管道。aspnet_isapi 模組建立固定數量的命名管道,並使用重疊的操作以通過小的執行緒池處理同一時間進行的連線。當通過管道進行的資料交換操作結束後,完成例程將斷開客戶端,並重新使用管道例項為新的客戶端服務。執行緒池和重疊操作均可以保證使 ASP.NET ISAPI 的效能達到令人滿意的水平。但是,aspnet_isapi 擴充套件決不會處理 HTTP 請求。

ASP.NET 請求的處理邏輯可以概括為以下步驟。

1. 當請求到達時,IIS 檢查資源型別並呼叫 ASP.NET ISAPI 擴充套件。如果啟用了預設的程式模型,aspnet_isapi 會將請求排隊,並將請求分配給輔助程式。所有的請求資料都通過非同步 I/O 傳送。如果啟用了 IIS 6 程式模型,請求將自動在輔助程式 (w3wp.exe) 中排隊,此輔助程式用於處理應用程式所屬的 IIS 應用程式池。IIS 6 輔助程式不瞭解 ASP.NET 和託管程式碼的任何情況,它只是處理 *.aspx 擴充套件並載入 aspnet_isapi 模組。當 ASP.NET ISAPI 在 IIS 6 程式模型中執行時,它的工作方式有所不同,僅在 w3wp.exe 輔助程式的上下文中載入 CLR。
2. 收到請求後,ASP.NET 輔助程式將通知 ASP.NET ISAPI,它將為請求服務。通知通過同步 I/O 實現。之所以使用同步模型,是因為請求只有在 ISAPI 內部請求表中被標記為“executing”,輔助程式才能開始處理它。如果請求已經由特殊的輔助程式進行處理,則不能再將它指定到其他程式,除非原始程式已取消。
3. 在輔助程式的上下文中執行請求。有時,輔助程式可能需要回撥 ISAPI 以完成請求,也就是需要說列舉伺服器變數。這種情況下,輔助程式將使用同步管道,因為這樣可以保持請求處理邏輯的順序。
4. 完成後,響應被髮送到開啟了非同步管道的 aspnet_isapi。現在,請求的狀態變為“Done”,之後將從請求表中被刪除。如果輔助程式崩潰,正在處理的所有請求仍將保持 “executing”狀態並持續一段時間。如果 aspnet_isapi 檢測到輔助程式已取消,它將自動終止請求並釋放所有相關的 IIS 資源。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-610965/,如需轉載,請註明出處,否則將追究法律責任。

相關文章