如何不关闭IIS的情况下更新或者替换应用程序的组件

在传统的asp的应用程序中,部署网页中所用的组件时,会使得更新和替换贬饷极其困难。只要应用程序正在加载或运行,都要保留一个到组件文件的引用。因此,要替换该组件文件,就不得不关闭IIS(这会使得WEB ...

在传统的asp的应用程序中,部署网页中所用的组件时,会使得更新和替换贬饷极其困难。只要应用程序正在加载或运行,都要保留一个到组件文件的引用。因此,要替换该组件文件,就不得不关闭IIS(这会使得WEB服务器临时断线),然后替换该文件,最后重新启动IIS。设计Asp.net的目标之一,就是无论何时需要更新凋者替换应用程序的组件,都不需要停止WEB应用程序的运行。也就是说,应用程序更新就像使用xcopy用新版本的组件替换WEB服务器上的组件。为了实现这种xcopy部署功能,asp.net的设计者必须确保以下两件事情:手先,正在运行的应用程序没有保持一个对组件文件的应用;其次,无论何时用新版本的组件文件替换原来的组件文件,该新版本组件必须承接所有以后对应用程序发出的请求。通过使用公共语言运行库提供的影子复制(shadow copy)机制,可以实现上述两个目标。

 

在.net中创建一个新的引用程序域时,可以将程序集的影子副本进行配置。AppDomainSetup类(该类用于初始化AppDomain)向外接提供了一个boolean类型的ShadowCopyFiles属性和一个string类型的CachePath属性;AppDomain类向外界提供了一个SetShadowCopyPath()方法,用于启用特定应用程序域的影子复制功能。Boolean型的ShadowCopyFiles属性为特定应用程序启用该机制,CachePath属性指定影子副本的基目录,SetShadowCopyPath()方法指定哪个目录可以启用影子复制。

 

asp.net为工作者进程中的每个应用程序创建一个单独的应用程序域。关于每个这样的域,启用/bin目录下的所有被引用的程序集的影子复制。程序集加载器不是直接从/bin目录下加载程序集,而是将所应用的程序集以物理方式复制到一个单独的目录(必须在应用程序的配置设置中指定该目录),然后从哪儿进行加载。这种机制还可以跟踪程序集的出处,因此,如果将程序集的新版本放到原来的/bin目录之下,则会把它重新复制到“影子”目录中,以后就引用该目录。
posted @ 2010-03-23 17:09  Jim哥  阅读(1367)  评论(0)    收藏  举报