本文將討論
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
中
這一程序被命名為aspnet_wp
exe
並且這一程序運行在本地的ASPNET計數器的前後安全關系中
在Windows
手工程序擁有w
wp
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
From:http://tw.wingwit.com/Article/program/net/201311/11383.html