本文把討論.NET的應用程式定義域,並且它們是怎麼樣對ASP.NET的執行和調度產生影響的。
當在Windows中啟動Notepad程式時,眾所周知程式會執行一個包含在容器內的進程。可以啟動多個Notepad的執行個體,並且每個執行個體都會在一個專註的進行程運行。使用工作管理員,可以看到在系統中當前啟動並執行所有進程的清單。
一個進程包括可執行從作業系統中保留的在記憶體中的代碼和程式資料。在進程之內只少有一個包含在進程之內的正在執行指令的線程,並且在多數情況下有多個線程。如果程式開啟了任何檔案或者資源,這些資源把屬於這個進程。
一個進程也有一個分界線。包含在進程之內的錯誤碼不能在當前進程之外的地區腐化。在一個進程之內很容易通訊,但是專業技術要求一個進程對另一個進程通訊是必需的。每一個進程也在一個特殊的上下文安全系統中運行,這個安全系統規定在機器和網路中進程做什麼。
一個進程是一個在Windows
作業系統中獨立啟動並執行最小單位。這會給在一個單一伺服器上對一大堆應用程式的ISP提出一個問題。ISP把會分離每一個在同一個伺服器上的與另一個公司的
應用程式幹擾的ASP.NET應用程式。但是相關的發射和執行一個對成百上千的應用程式的過程成本禁止的。
介紹應用程式定義域
.NET介紹一個應用程式定義域的概念,或者AppDomain像一個過程,AppDomain是既是容器又是邊界線。.NET已耗用時間使用
AppDomain作為代碼和資料的容器,就像作業系統一個過程作為代碼和資料的容器一樣。當作業系統使用一個過程來分離不整齊的代碼時,.NET運行時
間使用一個AppDomain來分離在一個安全邊線內的代碼。
一個AppDomain僅僅屬於一個單過程,但是單個過程能夠保持
多重的AppDomain。一個Appdomain建立起來相對容易(與一個過程比較起來),並且與一個過程比較起來具有少的維護費用。由於這些原因,一
個AppDomain是ISP(提供成千上萬的應用程式)的很好的解決方案。每一個應用程式可以生存在一個獨立的AppDomain之內,並且許多這樣的
AppDomain可以生存於一個單一的過程(節省費用)之內。
AppDomain
在同伺服器上建立了兩個ASP.NET應用程式,並且沒有任何特殊配置。會發生什麼事情呢?
一個單一的ASP.NET手工進程使ASP.NET應用程式變成兩方面的主要程式。在Windows XP和Windows
2000中,這一程式被命名為aspnet_wp.exe,並且這一程式運行在本地的ASPNET計數器的前後安全關係中。在Windows
2003手工程式擁有w3wp.exe並且預設運行在NETWOR SERVICE中。
一個對旬可以進住在一個
AppDomain中。每一個ASP.NET應用程式把具有它自己的一套全域變數:Cache,Application進住進同一進程,.NET
AppDomain是一個獨立的單元。如果存有共用的或靜態成員的類,並且那些類存在於兩種應用程式之內,每一個AppDomain擁有它自己的靜態欄位
的備份—資料並不共用。每一個應用程式的資料和代碼安全獨立存在並且在一邊界之內由AppDomain提供。
為了在AppDomain之間通訊或者在AppDomain之間交換對象,需要查看在.NET中穿過邊界的通訊技術,例如.NET細微的或Web 服務。
對把AppDomain作為邊界思想的警告之一是ASP.NET應用程式在預設情況下會帶著充分的信任運行。充分信任的代碼可以執行本地代碼,並且本地
代碼可以本質地在進程之內的任何內容。需要運行帶著部分信任執行應用程式來約束存取不完整的代碼並且對安全的AppDomain驗證所有代碼。
隱藏備份並且重新啟動
一旦一個集合載入到一個AppDomain,沒有辦法從AppDomain集合的辦法。不過,從一個進程中移除一個AppDomain是有可能的。
如果把一個已更新的dll複製到一個應用程式的子目錄中,從ASP.NET的已耗用時間知道有新代碼要執行。既然ASP.NET不能把dll複製到已存在
的AppDomain中,它就會起動一個新AppDomain。舊的應用程式定義域是“排水已停止”,那就是,存在的需要被允許完成執行並且一旦它們執行完成
AppDomain可以卸載。帶有新代碼的新的AppDomain就會開始並且開始所有的新請求。
典型地說,當一個dll載入進一個進程時,進程對dll加鎖並且不能對磁碟的上的檔案進行覆蓋。不過,AppDomain有一個眾所周知的特點:隱藏複製那所有的允許保留在磁碟上的那些未被加鎖的可替換的集合。
已耗用時間對二進位子目錄的帶有Shadow
Copy的ASP.NET進行初始化。AppDomain把任何的加鎖之前的dll從二進位子目錄中拷貝到一個臨時位置並且再把這些dll載入到記憶體。
Shadow Copy允許沒有把網頁線上的情況下對所有在二進位子目錄中的任何dll進行重寫。
熟練掌握Domain
應用程式定義域替換OS進程把為單獨的.NET結點單元。一個可理解的應用程式定義域把會給你一個在ASP.NET應用程式後的手工發生的概念。使用
AppDomain類的CurrentDomain屬性,可以檢查關於代碼正在啟動並執行AppDomain的屬性,包括我們在此文章中討論的Shadow
Copy。