我只能读到ASP.NET检测到特定文件(如aspx文件,DLL等)的更改。它将自动重启,使用新部署的文件完成当前运行的请求和新请求。
但是从第一个文件复制到最后一个文件的时间发生了什么?如果我交换第一个DLL文件,那么请求进来但其他DLL文件是旧版本 - 它会崩溃吗? asp.net会等待几秒钟,只有在没有(相关)文件更改X秒后才会自动启动吗?
THX!
答案 0 :(得分:2)
这里有4个问题: 从第一个文件复制到最后一个文件的时间发生了什么? - 有一个设置的时间,而.net在启动之前等待查看是否有任何其他文件被修改过加载了新dll的新app域。
如果我交换第一个DLL文件,那么请求进来但其他DLL文件是旧版本 - 它会崩溃吗? - 这取决于dll中的代码更改。如果新的代码可以使用旧代码正常运行,那么它会没问题。但是,如果应用程序域旋转新的DLL并且新的dll依赖于尚未存在的东西......那么是的,它将引发异常。
asp.net会等待几秒钟,只有在没有(相关)文件更改X秒后才会自动启动吗? - 是的。我无法找到那段时间。但根据我的个人经验,它在1-2秒的范围内。
我还在app域找到了一个很好的解释并重新加载了DLL: http://odetocode.com/Articles/305.aspx
如果您将更新的dll复制到 application的bin子目录, ASP.NET运行时识别存在 要执行的新代码。自ASP.NET 无法将dll交换为现有的 AppDomain,它启动一个新的AppDomain。 旧的应用领域是“消耗 停止了“,即现有的请求 被允许完成执行,并且 一旦他们全部完成了 AppDomain可以卸载。新的 AppDomain以新代码开头 开始接受所有新请求。
通常,当一个dll加载到一个 进程,进程锁定DLL和 你不能覆盖磁盘上的文件。 但是,AppDomains有一个功能 称为允许的影子复制 组件保持解锁状态 可在磁盘上更换。
运行时使用初始化ASP.NET 为bin启用了Shadow Copy 目录。 AppDomain将复制任何 它需要从bin目录到 锁定前的临时位置 并将DLL加载到内存中。 Shadow Copy允许我们覆盖任何 一个dll在bin目录中 更新而不上网 离线申请。