我们有一个托管在 IIS 中的 ASP Web 应用程序。有时,应用程序似乎重新启动并丢失了所有会话。因此,我在 global.asax 的 Application_Start 方法中添加了一个简单的日志记录,以查看它何时发生。这让我发现它真的在随机时间重新启动。
我读到应用程序池自动回收可能会导致这样的重启,所以我已经禁用了它。我还将流程模型的空闲超时设置为 1440 分钟。但即使积极使用,应用程序有时仍会重新启动。
我还尝试在 Windows 日志/系统中检查 Windows 事件查看器,并搜索 IIS-IISReset 资源。我可以找到手动 IIS 重置请求的日志,但没有找到在那些随机时间生成的日志。
您对如何找出意外重新启动应用程序的原因有什么想法吗?
除了AppPool回收之外,导致ASP.NET Web应用程序重启的原因也可能是AppDomain回收。
现在让我们看看什么会导致应用程序域回收:
1。正在更新 web.config。
来自 web.config 的配置被加载到应用程序中的 AppDomain 级别,因此为了获取新值,您的应用程序将重新启动,并且内存中的任何数据以及会话状态(如果它们是 inproc)都将丢失。
2。正在更新 Global.asax。
Global.asax 文件位于应用程序目录的根目录中。尽管它是自动添加到项目中的,但并不需要它。它提供了有用的应用程序事件处理程序,可用于在运行时跟踪应用程序行为。
与AppPool回收不同,AppDomain重启不会写入任何日志,因此您无法开箱即用地追踪它。然而,Global.asax 提供了应用程序事件,您可以向其中添加处理程序并执行日志记录等操作,以便跟踪由 AppDomain 回收引起的应用程序停止和启动。
3。更改应用程序文件夹的结构。
除 AppData 文件夹外,添加、删除或重命名 WebApplication 文件夹内的任何文件夹都会导致应用程序重新启动。如果您确实需要创建新的文件夹和文件,请坚持使用 AppData 文件夹
4。更改bin文件夹的内容。
bin 文件夹的任何更改都会导致 AppDomain 被卸载并重新加载到工作进程。更新 bin 文件夹基本上意味着您将要更改 AppDomain 的已加载程序集,因此 IIS 将重新加载您的 AppDomain 以获取这些更改。
5。更新非预编译文件(.aspx.cs、.cstml)。
如果您正在运行的 Web 应用程序包含大量未预编译的文件,例如 MVC Razor 视图 *.cshtml 的 WebForms 代码隐藏页面文件 *.aspx.cs,您可能会遇到应用程序连续重新启动的问题。默认值为 15,因此如果达到此数字,应用程序将重新启动。该值在全局和本地级别(machine.config 和 web.config)可用。
有关更多信息,您可以查看 MSDN 文章 https://msdn.microsoft.com/en-us/library/s10awwz0(v=vs.71).aspx
<system.web>
<compilation targetFramework="4.6.2" numRecompilesBeforeAppRestart="50" />
</system.web>
增加该数字可以解决应用程序重新启动的问题,但会增加应用程序的内存消耗,因此找到该属性的正确值取决于您的Web应用程序或网站拥有的非预编译文件的数量
6。正在更新机器配置。
Machine.config 对于主机上的所有网站都是通用的,因此更改它会影响主机上的所有网站。 machine.config 文件的任何更新都会导致所有 AppPool 回收以加载新配置。
根据框架和架构,机器配置应位于机器上的以下位置。
32 位
%WinDir%\Microsoft.NET\Framework\[.NET Framework Version]\CONFIG\machine.config
64 位
%WinDir%\Microsoft.NET\Framework64\[.NET Framework Version]\CONFIG\machine.config