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

时间:2016-08-20 03:40:25

标签: c# asp.net asp.net-mvc iis

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

  

_shutDownMessage =重新编译限制达到15个HostingEnvironment启动关闭HostingEnvironment导致关闭_shutDownStack =   在System.Environment.GetStackTrace(例外e,布尔needFileInfo)   在System.Environment.get_StackTrace()处   System.Web.Hosting.HostingEnvironment.InitiateShutdownInternal()at   System.Web.Hosting.HostingEnvironment.InitiateShutdownWithoutDemand()   在System.Web.HttpRuntime.ShutdownAppDomain(String stackTrace)at   System.Web.Compilation.DiskBuildResultCache.ShutdownCallBack(对象   国家)   System.Threading.ExecutionContext.RunInternal(执行上下文   executionContext,ContextCallback回调,对象状态,布尔值   preserveSyncCtx)at   System.Threading.ExecutionContext.Run(执行上下文   executionContext,ContextCallback回调,对象状态,布尔值   preserveSyncCtx)at   System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()   在System.Threading.ThreadPoolWorkQueue.Dispatch()

谷歌搜索此错误显示出惊人的少,所以我们更新了我们的web.config

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

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

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

1 个答案:

答案 0 :(得分:7)

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

通常,您会在事件查看器中看到事件ID为1305的事件。打开IIS管理器=&gt;应用程序池=&gt;右键单击应用程序池并转到高级设置=&gt;向下滚动到Generate Recycle Event Log Entry并将所有内容更改为true。此外,您可能需要启用health monitoring才能在事件查看器中查看详细信息。

enter image description here

当您将其增加到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" />

  4. 注意:

    如果您希望能够在不导致重新编译整个站点的情况下更改顶级文件,则可以将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.这   导致四次应用程序重启,即使只需要一次。

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

    希望这有帮助