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

Ada*_*m K 7 c# asp.net iis asp.net-mvc

在某些时候,在代码推送后不久,我们看到我们的Web应用程序中发生了大量重启,没有任何记录表明存在任何问题.所以我发现这篇文章:http://weblogs.asp.net/scottgu/433194并且我们添加了Application_End日志记录,它立即显示了这个:

_shutDownMessage = 15重新编译极限达到HostingEnvironment启动的关闭HostingEnvironment在系统停机引起= _shutDownStack在System.Environment.GetStackTrace(例外五,布尔needFileInfo)在System.Environment.get_StackTrace()在System.Web.Hosting.HostingEnvironment.InitiateShutdownInternal()位于System.Web.Comp.D.P.ThutdownCallBack(对象状态)的System.Web.HttpRuntime.ShutdownAppDomain(String stackTrace)中的.Web.Hosting.HostingEnvironment.InitiateShutdownWithoutDemand(),System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext,ContextCallback callback) ,对象的状态,布尔preserveSyncCtx)在System.Threading.ExecutionContext.Run(的ExecutionContext的ExecutionContext,ContextCallback回调,对象的状态,布尔preserveSyncCtx)在System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()在System.Threading.ThreadPoolWorkQueue .调度()

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

 <compilation debug="false" numRecompilesBeforeAppRestart="100">
Run Code Online (Sandbox Code Playgroud)

和中提琴!一切恢复正常.我们彻底审查了我们的变化,但没有找到任何我们认为可能是罪魁祸首的事情.

有没有其他人遇到这个或类似的,或者对世界上有什么可能导致这种情况的知识/怀疑?任何反馈都会很棒!

Rav*_* A. 8

因此,应用程序实际上正在重新编译,并且由于重新编译后15 的默认限制是应用程序域/应用程序池的回收.

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

在此输入图像描述

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

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

  1. 默认情况下,如果对网站中的顶级文件进行任何更改,则会重新编译整个站点.顶级文件包括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/
  2. 修改web.config
  3. 如果SectionInformation.RestartOnExternalChanges属性为true ,则配置包括文件更改

    <section name="MyAppSettings" type="System.Configuration.AppSettingsSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" restartOnExternalChanges="true" requirePermission="false" />

笔记:

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

参考文献:

了解ASP.Net动态编译

重新编译的另一个常见原因是由于文件被写入源代码文件夹,例如在源代码文件夹中编写日志文件或反病毒试图扫描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.这导致四个应用程序重新启动,即使只需要一个.

它讨论了内存含义,因此请确保您已启用定期应用程序池回收.

希望这可以帮助