本文将讨论NET的应用程序域并且它们是如何对ASPNET的执行和调度产生影响的
当在Windows中启动Notepad程序时众所周知程序会执行一个包含在容器内的进程可以启动多个Notepad的实例并且每个实例都会在一个专注的进行程运行使用任务管理器可以看到在系统中当前运行的所有进程的清单
一个进程包括可执行从操作系统中保留的在内存中的代码和程序数据在进程之内只少有一个包含在进程之内的正在执行指令的线程并且在多数情况下有多个线程如果程序打开了任何文件或者资源这些资源将属于这个进程
一个进程也有一个分界线包含在进程之内的错误代码不能在当前进程之外的地区腐化在一个进程之内很容易通讯但是专业技术要求一个进程对另一个进程通讯是必需的每一个进程也在一个特殊的上下文安全系统中运行这个安全系统规定在机器和网络中进程做什么
一个进程是一个在Windows 操作系统中独立运行的最小单位这会给在一个单一服务器上对一大堆应用程序的ISP提出一个问题ISP将会分离每一个在同一个服务器上的与另一个公司的应用程序干扰的ASPNET应用程序但是相关的发射和执行一个对成百上千的应用程序的过程成本禁止的
介绍应用程序域
NET介绍一个应用程序域的概念或者AppDomain像一个过程AppDomain是既是容器又是边界线NET运行时间使用AppDomain作为代码和数据的容器就像操作系统一个过程作为代码和数据的容器一样当操作系统使用一个过程来分离不整齐的代码时NET运行时间使用一个AppDomain来分离在一个安全边线内的代码
一个AppDomain仅仅属于一个单过程但是单个过程能够保持多重的AppDomain一个Appdomain创建起来相对容易(与一个过程比较起来)并且与一个过程比较起来具有少的维护费用由于这些原因一个AppDomain是ISP(提供成千上万的应用程序)的很好的解决方案每一个应用程序可以生存在一个独立的AppDomain之内并且许多这样的AppDomain可以生存于一个单一的过程(节省费用)之内
AppDomain
在同服务器上创建了两个ASPNET应用程序并且没有任何特殊配置会发生什么事情呢?
一个单一的ASPNET手工进程使ASPNET应用程序变成两方面的主要程序在Windows XP和Windows 中这一程序被命名为aspnet_wpexe并且这一程序运行在本地的ASPNET计数器的前后安全关系中在Windows 手工程序拥有wwpexe并且默认运行在NETWOR SERVICE中
一个对旬可以进住在一个AppDomain中每一个ASPNET应用程序将具有它自己的一套全局变量CacheApplication进住进同一进程NET AppDomain是一个独立的单元如果存有共享的或静态成员的类并且那些类存在于两种应用程序之内每一个AppDomain拥有它自己的静态字段的备份—数据并不共享每一个应用程序的数据和代码安全独立存在并且在一边界之内由AppDomain提供
为了在AppDomain之间通讯或者在AppDomain之间交换对象需要查看在NET中穿过边界的通讯技术例如NET细微的或Web 服务
对将AppDomain作为边界思想的警告之一是ASPNET应用程序在默认情况下会带着充分的信任运行充分信任的代码可以执行本地代码并且本地代码可以本质地在进程之内的任何内容需要运行带着部分信任执行应用程序来约束存取不完整的代码并且对安全的AppDomain验证所有代码
隐藏备份并且重新启动
一旦一个集合加载到一个AppDomain没有办法从AppDomain集合的办法不过从一个进程中移除一个AppDomain是有可能的
如果将一个已更新的dll复制到一个应用程序的子目录中从ASPNET的运行时间知道有新代码要执行既然ASPNET不能将dll复制到已存在的AppDomain中它就会起动一个新AppDomain旧的应用程序域是排水已停止那就是存在的需要被允许完成执行并且一旦它们执行完成AppDomain可以卸载带有新代码的新的AppDomain就会开始并且开始所有的新请求
典型地说当一个dll加载进一个进程时进程对dll加锁并且不能对磁盘的上的文件进行覆盖不过AppDomain有一个众所周知的特点隐藏复制那所有的允许保留在磁盘上的那些未被加锁的可替换的集合
运行时间对二进制子目录的带有Shadow Copy的ASPNET进行初始化AppDomain将任何的加锁之前的dll从二进制子目录中拷贝到一个临时位置并且再将这些dll加载到内存Shadow Copy允许没有将网页在线的情况下对所有在二进制子目录中的任何dll进行重写
熟练掌握Domain
应用程序域替换OS进程将为单独的NET结点单元一个可理解的应用程序域将会给你一个在ASPNET应用程序后的手工发生的概念使用AppDomain类的CurrentDomain属性可以检查关于代码正在运行的AppDomain的属性包括我们在此文章中讨论的Shadow Copy