ApplicationShutdownReason.BuildManagerChange和ApplicationPool在IISExpress中重新启动

时间:2013-04-02 12:13:04

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

我们遇到了问题。我们正在使用IISExpress 8.0 for Asp.net WebForm应用程序(.net 4.0)。 Comupter在Windows 7 x64下运行。

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

在互联网上搜索不会提供任何有用的细节。大多数人都建议使用IIS而不是IISExpress。

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

更新

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

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

UPDATE2

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

UPDATE3 微软有一个问题 - 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中修复了它。

1 个答案:

答案 0 :(得分:2)

这不是一个完整的答案,所以你可以从中获取任何好处。

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

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

可能。