asp.net - ApplicationShutdownReason.BuildManagerChange 和 ApplicationPool 在 IISExpress 中重启

标签 asp.net .net iis-7 visual-studio-2012 iis-express

我们出现了问题。我们将 IISExpress 8.0 用于 Asp.net WebForm 应用程序(.net 4.0)。
计算机在 Windows 7 x64 下运行。

有时 ApplicationPool 会无故重启。我知道它会在 15 个 aspx\ascx 文件更改后重新启动。但在这种情况下,它会在没有任何更改的情况下重新启动。
在 ApplicationEnd 上,我们找到了重启的原因。它是 ApplicationShutdownReason.BuildManagerChange .

在 Internet 上搜索不会提供任何有用的详细信息。大多数情况下都建议使用 IIS 而不是 IISExpress。

你知道可能是什么原因吗?

更新 :

深入研究 .Net 4 源代码给出了这次关闭的两个原因。
当有人从临时 Asp.net 文件夹更改 hash.web 文件时触发其中之一。例如 - “c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\app\a83dcad1\be4aa699\hash\hash.web”

第二个原因是 BuildManager 构建了一些对象并将 BuildResult 缓存在 HttpCache 中。然后,如果它已过期,它会检查此 BuildResult 在缓存过期时是否需要 ShutdownAppDomainOnChange。如果它需要它,那么它会触发 BuildManagerChange 关闭。

更新2

在我们的例子中,重启是由 hash.web 更改引起的。似乎 IISExpress 在没有任何源代码更改的情况下更新它,但为什么呢?

更新3
微软有一个关于它的问题 - https://connect.microsoft.com/VisualStudio/feedback/details/783440/microsoft-visualstudio-web-host-exe-touches-hash-web-and-should-not-be-running
他们说他们在 Visual Studio 2012 Update 2 中修复了它。

最佳答案

这不是一个完整的答案,因此请从中获取任何好处。

似乎发生了两件事:hash.web更改可能是因为 IIS 使用临时位置来存储您构建的应用程序 DLL。当这个文件发生变化时,IIS 知道你构建了一个新版本的应用程序,需要重新启动它;这可以解释应用程序池重置。

对于缓存过期,似乎 IIS 正在尝试在不同的应用程序域中卸载和重新加载某些内容。没有办法(在 .NET 中)卸载程序集而不卸载应用程序域(我认为)一旦它被加载,所以这是实现这一目标的“通常”方法。

也许。

关于asp.net - ApplicationShutdownReason.BuildManagerChange 和 ApplicationPool 在 IISExpress 中重启,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15763838/

相关文章:

asp.net - 如何使用或完成意大利面条代码?

javascript - 如何在用户进入 asp.net 站点一段时间后生成弹出窗口

c# - 具有自动实现属性和构造函数初始值设定项的结构

asp.net - 开发 Web 服务器在 404 上触发 Application_Error,为什么 IIS7 没有?

iis-7 - 找不到 ASP 包含文件

c# - Devexpress ASPxPopupControl 不弹出

asp.net - gridview rowCommand中的行索引

.net - 为什么升级到 razor 2/mvc 4 后我的 razor View 提示 "} expected"?

c# - 为什么在使用 foreach 时不执行此 LINQ 查询?

javascript - 在 IIS7 上启用跨域资源共享