ASP.NET HTTP運行時組成詳解

來源:互聯網
上載者:User
asp.net|詳解 簡介

不管使用哪種底層平台,可靠性和效能都是對所有 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,未整合Managed 程式碼。它是接收和指派對各種 ASP.NET 資源的請求的控制中心。按照設計,該模組存在於 IIS 進程中,在具有管理員權限的 SYSTEM 帳戶下運行。開發人員和系統管理員不能修改此帳戶。ASP.NET ISAPI 擴充負責調用 ASP.NET 輔助進程 (aspnet_wp.exe),而該進程又負責控制請求的執行。除了對請求進行安排以外,ASP.NET ISAPI 還監視輔助進程的運行情況,並在效能降低到一定程度時將進程取消。

  輔助進程是一小段 Win32 shell 代碼,整合了公用語言運行庫 (CLR) 並運行Managed 程式碼。它負責處理對 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 請求的處理邏輯可以概括為以下步驟:

  當請求到達時,IIS 檢查資源類型並調用 ASP.NET ISAPI 擴充。如果啟用了預設的進程模型,aspnet_isapi 會將請求排隊,並將請求分配給輔助進程。所有的請求資料都通過非同步 I/O 發送。如果啟用了 IIS 6 進程模型,請求將自動在輔助進程 (w3wp.exe) 中排隊,此輔助進程用於處理應用程式所屬的 IIS 應用程式集區。IIS 6 輔助進程不瞭解 ASP.NET 和Managed 程式碼的任何情況,它只是處理 *.aspx 擴充並載入 aspnet_isapi 模組。當 ASP.NET ISAPI 在 IIS 6 進程模型中運行時,它的工作方式有所不同,僅在 w3wp.exe 輔助進程的上下文中載入 CLR。

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

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

  以上說明是指預設的 ASP.NET 進程模型,即在 IIS 5.x 中啟動並執行工作模型。IIS 6(Windows Server 2003 提供)的預設工作方式對 ASP.NET 進程模型也有影響。當整合在 IIS 6.0 中時,ASP.NET 1.1 會自動調整自己的工作方式以適應宿主環境。這時,不再需要使用 aspnet_wp 輔助進程,machine.config 檔案中定義的某些配置參數也被忽略。從 ASP.NET 的角度來看,IIS 6 的最大改變是有關請求的一切都在 aspnet_isapi 的控制之下,且都處在 w3wp.exe 輔助進程的上下文中。輔助進程的帳戶是為 Web 應用程式所屬的應用程式集區設定的帳戶。預設情況下,該帳戶是 NETWORKSERVICE—,它是一個內建的弱帳戶,在功能上與 ASPNET 等價。

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

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

  表 1:構成 ASP.NET 運行時環境的可執行檔
名稱 類型 帳戶
aspnet_isapi.dll Win32 DLL(ISAPI 擴充) LOCAL SYSTEM
aspnet_wp.exe Win32 EXE ASPNET
aspnet_filter.dll Win32 DLL(ISAPI 篩選器) LOCAL SYSTEM
aspnet_state.exe Win32 NT Service ASPNET


  aspnet_filter.dll 組件是一個小的 Win32 ISAPI 篩選器,用來備份 ASP.NET 應用程式的無 Cookie 工作階段狀態。在 Windows Server 2003 中,當啟用 IIS 6 進程模型時,aspnet_filter.dll 還將篩選出 Bin 目錄中對非可執行資源的請求。

  aspnet_state.exe 的作用對 Web 應用程式更為重要,因為它用於管理工作階段狀態。該項服務是可選的,可以用來在 Web 應用程式記憶體空間之外儲存工作階段狀態資料。該可執行檔是一種 NT 服務,既可以在本地運行,也可以遠程運行。當該服務被啟用後,可以將 ASP.NET 應用程式配置為將所有會話資訊儲存在此進程的記憶體中。一種類似的方案是提供更為可靠的資料存放區方式,不受進程回收和 ASP.NET 應用程式故障的影響。該服務在 ASPNET 本地帳戶下運行,但可以使用服務控制管理員 (Service Control Manager) 介面來配置它。

  另一個應該介紹的可執行檔是 aspnet_regiis.exe,儘管嚴格來講,它並不屬於 ASP.NET 運行時結構。該公用程式可以用來配置環境,以在一台電腦上並存執行不同版本的 ASP.NET,還可用於維修 IIS 和 ASP.NET 損壞的配置。該公用程式的工作方式是更新儲存在 IIS 設定資料庫的根目錄和子目錄中的指令碼映射。指令碼映射是資源類型和 ASP.NET 模組之間的一種關聯關係。最後,還可以使用該工具來顯示已安裝的 ASP.NET 版本的狀態,執行其他配置操作,如授予對特定檔案夾的 NTFS 許可權、建立客戶指令碼目錄。

  Web Garden 模型

  Web Garden 模型可以通過 machine.config 檔案中的 <processModel> 部分進行配置。請注意,<processModel> 部分是唯一不能放在應用程式特定的 web.config 檔案中的配置部分。這就是說,Web Garden 模式可以應用到電腦中啟動並執行所有應用程式。但通過使用 machine.config 源檔案中的 <location> 節點,可以針對各個應用程式調節電腦的設定。

  <processModel> 部分有兩個屬性可以影響 Web Garden 模型,它們是 webGarden 和 cpuMask。webGarden 屬性接受布爾值,表示是否使用了多個輔助進程(一個相關的 CPU 對應一個進程)。預設情況下,該屬性的值為 false。cpuMask 屬性儲存一個 DWORD 值,該值的二進位表示為能夠運行 ASP.NET 輔助進程的 CPU 提供了位屏蔽。其預設值為 -1 (0xFFFFFF),表示可以使用所有可用的 CPU。如果 webGarden 屬性為 false,則 cpuMask 屬性的內容將被忽略。cpuMask 屬性還為正在啟動並執行 aspnet_wp.exe 的副本數設定了上限。

  常言道“閃光的不都是金子”,用在這裡很合適。Web Garden 模式使得多個輔助進程可以同時運行。但是,需要注意的是所有進程都會有自己的應用程式狀態、進程內工作階段狀態、ASP.NET 緩衝、待用資料以及運行應用程式所需的其他內容。啟用 Web Garden 模式之後,ASP.NET ISAPI 將根據 CPU 的數量儘可能多地啟動輔助進程,每個輔助進程都是下一進程的完整複製(每一進程都與相應的 CPU 密切相關)。為平衡工作負載,傳入的請求以單迴圈的方式在啟動並執行進程之間進行劃分。輔助進程就象在單一處理器中一樣被回收。請注意,ASP.NET 繼承了作業系統中所有的 CPU 使用限制,並且不包括實現限制的自訂語義。

  總之,Web Garden 模型並不適用於所有應用程式。應用程式的狀態越多,其的效能損失也越多。工作資料存放區在共用記憶體的塊中,以便一個進程輸入的變化可以立即被其他進程得知。但是,處理請求時,工作資料被複製到進程的上下文中。因此,各個輔助進程將處理自己的工作資料,而應用程式的狀態越多,效能損失就越大。鑒於此,仔細、明智的應用程式基底准測試是絕對必要的。

  只有重啟 IIS 後,對設定檔中 <processModel> 部分所做的更改才會生效。在 IIS 6 中,Web Garden 模式的參數儲存在 IIS 設定資料庫中,webGarden 和 cpuMask 屬性被忽略。

  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 服務)所進行的更改。如果檢測到更改,應用程式物件將確保編譯並載入所請求的資源的最新來源。

  臨時檔案和頁面程式集

  要全面瞭解 ASP.NET HTTP 運行時,讓我們來分析一下當請求 ASP.NET 頁面時,檔案系統層所發生的變化。接下來,您將瞭解由 HTTP 管道的對象管理和監視的一組動態建立的臨時檔案。

  雖然可以將頁面的核心代碼隔離在代碼背後的 C# 或 Microsoft? Visual Basic? .NET 類中,但可以將 Web 頁面編寫和部署為 .aspx 文字檔。對於要顯示為 URL 的頁面來說,.aspx 檔案在應用程式的 Web 空間中必須始終可用。.aspx 檔案的實際內容將確定應用程式物件要載入的程式集(或多個程式集)。

  按照設計,HttpApplication 對象將尋找一個根據請求的 ASPX 檔案命名的類。如果頁面命名為 sample.aspx,則要載入的相應的類名為 ASP.sample_aspx。應用程式物件在 Web 應用程式的所有組件檔夾中尋找這樣的類,這些檔案夾包括全域組件快取 (GAC)、Bin 子檔案夾和 Temporary ASP.NET Files 檔案夾。如果未找到這樣的類,HTTP 結構將分析 .aspx 檔案的原始碼,建立一個 C# 或 Visual Basic .NET 類(具體建立哪種類,取決於 .aspx 頁面上設定的語言),同時對其進行編譯。新建立的程式集的名稱是隨機產生的,位於特定於應用程式的子檔案夾中,路徑如下所示: C:WINDOWSMicrosoft.NETFrameworkv1.1.4322Temporary ASP.NET Files。

  子檔案夾 v1.1.4322 特定於 ASP.NET 1.1。如果您使用的是 ASP.NET 1.0,子檔案夾的版本號碼會有所不同,即子檔案夾名為 v1.0.3705。再次訪問頁面時,程式集就已存在,不需要重新建立。但是,HttpApplication 對象是如何確定特定於頁面的程式集是否存在呢?它每次都要掃描大量檔案夾嗎?不,並不是這樣。

  應用程式物件只查看 Temporary ASP.NET Files 檔案夾中某個特殊檔案夾的內容。具體路徑(特定於應用程式的路徑)由 HttpRuntime.CodegenDir 屬性返回。如果是第一次訪問 .aspx 檔案(即還未建立頁面程式集),則該檔案夾中就不存在以 ASPX 頁面名稱開頭的 XML 檔案。例如,具有動態程式集的 sample.aspx 頁面應有如下的條目:

  sample.aspx.XXXXX.xml

  XXXXX 預留位置是一種散列代碼。通過讀取該 XML 檔案的內容,應用程式物件就可以瞭解要載入的程式集的名稱以及要在其中擷取的類。以下程式碼片段是這種 Helper 檔案的典型內容。包含 ASP.sample_aspx 類的程式集的名稱是 mvxvx8xr。

<preserve assem="mvxvx8xr" type="ASP.sample_aspx">
<filedep name="c:inetpubwwwrootvdirsample.aspx" />
</preserve>

  當然,只有在分析 filedep 檔案的原始碼以產生動態程式集時才建立該檔案。對 filedep 檔案所做的任何更改都會使程式集無效,在下一次請求時必須重新編譯。需要注意的是,在 ASP.NET 架構的未來版本中,該實現過程可能會有較大改變。不論什麼原因,只要您決定在當前應用程式中使用它,都必須十分小心。

  由於更新而要為頁面建立新的程式集時,ASP.NET 將驗證是否可以刪除舊的程式集。如果舊的程式集只包含修改後的頁面的類,ASP.NET 將試圖刪除並替換該程式集,否則將在保留舊程式集的情況下建立一個新程式集。

  在刪除過程中,ASP.NET 可能會發現組件檔已被載入並鎖定。這種情況下,可以為舊程式集添加一個“.DELETE”副檔名,以將其重新命名。(注意,所有 Windows 檔案都可以在使用過程中重新命名。)只要應用程式重新啟動(例如,由於對某個應用程式檔案如 global.asax 和 web.config 進行了更改),這些臨時的 .DELETE 檔案就將被刪除。但在處理下一個請求時,ASP.NET 運行時不會刪除這些檔案。

  請注意,預設情況下,在整個應用程式重新啟動之前,每個 ASP.NET 應用程式最多可以重新編譯 15 個頁面,同時會損失一些會話和應用程式資料。當最近的編譯次數超過了 <httpRuntime> 部分的 numRecompilesBeforeAppRestart 屬性中設定的閾值時,將卸載 AppDomain,並重新啟動應用程式。還要注意,在 .NET Framework 中,您無法卸載單個程式集。AppDomain 是可以從 CLR 卸載的最小的代碼塊。

  小結

  ASP.NET 應用程式有兩大特徵:進程模型和頁面物件模型。ASP.NET 提前使用了 IIS 6.0 的一些功能,而 IIS 6.0 則是 Windows Server 2003 中提供的全新的、開創性的 Microsoft Web 資訊服務。尤其值得一提的是,在獨立的輔助進程中啟動並執行 ASP.NET 應用程式,其行為與 IIS 6 中的所有應用程式相同。而且,儘管會出現運行時異常、記憶體泄露或程式錯誤,ASP.NET 運行時仍能自動回收輔助進程以保證實現卓越的效能。這種功能已成為 IIS 6.0 的系統功能。

  在本文中,我概括介紹了預設的 ASP.NET 進程模型的基礎知識,以及 IIS 級代碼(ASP.NET ISAPI 擴充)和輔助進程之間的互動。同時,還介紹了與 IIS 6 進程模型之間的最新區別。



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。