ASP.NET HTTP運行時組成詳解(5)
發表于:2007-06-30來源:作者:點擊數:
標簽:
臨時文件和頁面程序集 要全面了解 ASP.net HTTP 運行時,讓我們來分析一下當請求 ASP.NET 頁面時,文件系統層所發生的變化。接下來,您將了解由 HTTP 管道的對象管理和監視的一組動態創建的臨時文件。 雖然可以將頁面的核心代碼隔離在代碼背后的 C# 或 Micro
臨時文件和頁面程序集
要全面了解 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:\Windows\Microsoft.NET\Framework\v1.1.4322\Temporary 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:\inetpub\wwwroot\vdir\sample.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 進程模型之間的最新區別。
原文轉自:http://www.kjueaiud.com