ASP.NET MVC 重新编译限制达到 15 HostingEnvironment 启动关闭 HostingEnvironment 导致关闭

Posted

技术标签:

【中文标题】ASP.NET MVC 重新编译限制达到 15 HostingEnvironment 启动关闭 HostingEnvironment 导致关闭【英文标题】:ASP.NET MVC Recompilation limit of 15 reached HostingEnvironment initiated shutdown HostingEnvironment caused shutdown 【发布时间】:2016-12-27 06:36:26 【问题描述】:

在某个时间点,在代码推送后不久,我们看到我们的 Web 应用程序发生了多次重新启动,但没有任何日志记录表明存在任何问题。所以我找到了这篇文章:http://weblogs.asp.net/scottgu/433194,我们添加了 Application_End 日志记录,它立即揭示了这一点:

_shutDownMessage=重新编译限制达到 15 HostingEnvironment 启动关闭 HostingEnvironment 导致关闭 _shutDownStack= 在 System.Environment.GetStackTrace(异常 e,布尔需要文件信息) 在 System.Environment.get_StackTrace() 在 System.Web.Hosting.HostingEnvironment.InitiateShutdownInternal() 在 System.Web.Hosting.HostingEnvironment.InitiateShutdownWithoutDemand() 在 System.Web.HttpRuntime.ShutdownAppDomain(字符串 stackTrace) 在 System.Web.Compilation.DiskBuildResultCache.ShutdownCallBack(对象 州)在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext、ContextCallback 回调、对象状态、布尔值 preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext、ContextCallback 回调、对象状态、布尔值 preserveSyncCtx) 在 System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() 在 System.Threading.ThreadPoolWorkQueue.Dispatch()

谷歌搜索这个错误发现很少,所以我们更新了我们的 web.config

 <compilation debug="false" numRecompilesBeforeAppRestart="100">

还有中提琴!一切恢复正常。我们彻底审查了我们的更改,但没有发现任何我们认为可能是罪魁祸首的东西。

有没有其他人遇到过这种情况或类似情况,或者知道/怀疑世界上可能是什么原因导致了这种情况?任何反馈都会很棒!

【问题讨论】:

【参考方案1】:

因此,应用程序实际上正在重新编译,并且由于 default limit 在 15 次重新编译后为 15,因此应用程序域/应用程序池会回收。

通常您会在事件查看器中看到事件 ID 为 1305 的事件。打开 IIS 管理器 => 应用程序池 => 右键单击​​应用程序池并转到高级设置 => 向下滚动以生成回收事件日志条目并更改所有内容为真。此外,您可能需要启用health monitoring 才能在事件查看器中查看详细信息。

当您将其增加到 100 时,未达到限制,因此应用程序池将在常规回收计划期间回收(默认每 29 小时)

导致整个网站重新编译的原因列表:

    默认情况下,对网站中的***文件进行任何更改时,都会重新编译整个网站。***文件包括 global.asax 文件以及 bin/ 和 App_Code/ 文件夹中的所有文件。此处的其他详细信息 - https://blogs.msdn.microsoft.com/tmarq/2007/11/01/asp-net-file-change-notifications-exactly-which-files-and-directories-are-monitored/ 修改 web.config

    如果SectionInformation.RestartOnExternalChanges 属性为真,则配置包括文件更改

    &lt;section name="MyAppSettings" type="System.Configuration.AppSettingsSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" restartOnExternalChanges="true" requirePermission="false" /&gt;

注意事项:

如果您希望能够在不重新编译整个站点的情况下更改***文件,可以将 Web.config 文件中编译元素的 optimizeCompilations 属性设置为 true

参考资料:

Understanding ASP.Net dynamic compilations

重新编译的另一个常见原因是由于将文件写入源代码文件夹,例如在源代码文件夹中写入日志文件或防病毒尝试扫描 Web 应用程序文件夹并可能将某些内容写入它(您可以从防病毒扫描中排除 Web 应用程序文件夹,看看是否有帮助)。

但是,要准确找出导致重新编译的原因,您需要捕获 ETW 跟踪并查看。这里给出了关于如何做到这一点的详细解释 - https://blogs.msdn.microsoft.com/tess/2008/11/06/troubleshooting-appdomain-restarts-and-other-issues-with-etw-tracing/

这里还提到了一个已知问题 - http://support.microsoft.com/kb/319947

链接中的相关文字

但是,当您加载许多新的 .aspx 或 .ascx 时,会出现此问题 文件到服务器(例如,61 个文件)。服务器卸载 前 15 个文件每次重新编译时的应用程序 重新编译另外 15 个文件,直到服务器达到 61。这 即使只需要一次,也会导致四次应用程序重新启动。

它谈到了内存影响,因此请确保您确实启用了定期应用程序池回收。

希望对你有帮助

【讨论】:

这里有很多很棒的信息,谢谢 - 如果我们确定确切原因,将发布更新。 这样的答案是你只能在 *** 上找到的小金块!谢谢!

以上是关于ASP.NET MVC 重新编译限制达到 15 HostingEnvironment 启动关闭 HostingEnvironment 导致关闭的主要内容,如果未能解决你的问题,请参考以下文章

在默认的 ASP.Net MVC 模板中,为啥用户每次更改时都会重新登录?

ASP.NET MVC,操纵 URL 结构

在 ASP.NET vNext 中,为啥没有即时重新编译代码?

asp.net mvc 设置一个action的访问人数,达到上线排队

ASP.NET MVC5 视图预编译

ASP.NET MVC 控制器通过继承控制器来达到 过滤 并且多了一个IAuthenticationFilter