2010-02-05 114 views
1

我只能读取ASP.NET检测到特定文件(如aspx文件,DLL等)的更改。它将自行重新启动,使用新部署的文件完成当前运行的请求和新的请求。ASP.NET如何处理部署

但是从第一个文件复制到最后一个被更换的时间发生了什么?如果我交换第一个DLL文件,然后请求进来,但其他DLL文件是在一个较旧的版本 - 它只会崩溃?请问asp.net会等待几秒钟,并且在没有(相关)文件更改X秒后才会自动启动新的操作?

Thx!

回答

2

这里有4个问题: 从第一个文件复制到最后一个被更换的时间发生了什么? - 有一段时间,.net等待查看是否有任何其他文件已被修改,然后启动新的应用程序域并加载新的dll。

如果我交换第一个DLL文件,然后请求进来,但其他DLL文件是在旧版本 - 它只会崩溃? - 这取决于dll中的代码更改。如果新的DLL可以很好地运行旧代码,那么它会没事的。但是,如果应用程序域旋转了新的DLL,并且新的DLL依赖于那些还没有的东西,那么是的,它会抛出一个异常。

asp.net是否会等待几秒钟,只有在没有(相关)文件更改X秒后才会自动启动新的? - 是的。我一直无法找到那段时间。但在我个人的经验中,它在1-2秒的范围内。

我还发现了一个很好的解释这里的DLL的应用程序域和重新加载: http://odetocode.com/Articles/305.aspx

如果复制更新的DLL到 应用程序的bin子目录中, ASP.NET运行时承认有是 要执行的新代码。由于ASP.NET 不能将该dll交换到现有的 AppDomain中,因此它将启动一个新的AppDomain。 旧的应用程序域名为“drain stopped”,即现有请求 被允许执行完毕,而 一旦全部完成 AppDomain可以卸载。新的 AppDomain以新代码开始,并且 开始接受所有新请求。

通常,当一个dll加载到一个 进程中时,该进程会锁定dll和 ,您无法覆盖磁盘上的文件。 但是,AppDomain具有称为Shadow Copy的 功能,允许 程序集保持解锁状态, 可在磁盘上替换。

运行时初始化ASP.NET 已启用对bin 目录的卷影复制。在锁定 并将dll加载到内存之前,AppDomain会将其需要的任何 dll从bin目录复制到 临时位置。 Shadow Copy允许我们在 更新期间覆盖bin目录中的任何 dll,而无需使web 应用程序脱机。

+0

太好了 - 这正好回答我的问题! 谢谢你的详细解答:) – Eleasar 2010-04-07 10:18:57