如何在应用程序池回收后预热我的 asp.net mvc webapp?

Agi*_*Jon 29 asp.net-mvc iis-8

我在 IIS 8.0 中运行一个 ASP.NET MVC webapp。在接受请求之前,我的应用程序需要预热。我们已经有了在部署新代码时自动预热应用程序的过程。但是,我们看到周期性的 App Pool Recycle 事件导致应用程序无法预热。

是否有检测应用程序池回收事件并执行脚本或某些代码的最佳实践?

ahm*_*yed 60

您可以执行以下几项操作:

1. 应用初始化

您可以使用IIS 8.0 自带的应用程序初始化模块

你可以有这样的东西在你的 web.config

<applicationInitialization
     doAppInitAfterRestart="true" >
   <add initializationPage="/" />
</applicationInitialization>
Run Code Online (Sandbox Code Playgroud)

initializationPage="/"每次您的应用程序自动启动时,这都会向您的应用程序的根目录 ( )发送一个请求。

您还可以为您的应用程序池配置启动模式,Always Running这意味着每次 IIS 重新启动时,它都会确保立即启动您的应用程序池(如果从右键单击您的应用程序池然后Advanced Settings

在此处输入图片说明

Preload为您的网站本身(右键点击该网站上,然后Manage SiteAdvanced Settings

在此处输入图片说明

2. 禁用空闲超时

此外,您可以通过将Idle Time-out应用程序池的 in 更改为 0(无限)来禁用 idleTimeout(默认情况下 IIS 将在活动 20 分钟后关闭应用程序)

在此处输入图片说明

3.禁用定期回收

Regular Time Interval (minutes)默认关闭IIS 会每 29 小时回收一次您的应用程序。

在此处输入图片说明

为了

  • 对这些设置的缺点的评论将不胜感激。当然,它们不是默认值是有原因的。 (4认同)
  • 当然,如果您在同一个 IIS 机器上运行多个站点,那么内存消耗会很高,因为所有站点都一直处于活动状态,这会导致站点密度非常低。也无法防止应用程序中的内存泄漏。请记住,IIS 在托管语言成为 Web 流行之前就已经存在,并且许多应用程序正在运行本机处理程序,如果长时间运行,这些处理程序会进入内存泄漏和奇怪状态。这样做是为了帮助由于应用程序问题而不得不在半夜醒来以重置服务器的系统管理员。出于向后可比性的原因,它们仍然是默认值 (2认同)
  • 您可以使 IIS 7.5 的 [应用程序初始化模块](http://www.iis.net/downloads/microsoft/application-initialization) 用于 #1 工作。#2 和 #3 原样适用于 IIS 7.5 (2认同)
  • 仅供参考:`applicationInitialization` 进入`&lt;configuration&gt;&lt;system.webServer&gt;` (2认同)