IIS 10应用程序池入睡

时间:2018-07-15 12:35:58

标签: iis iis-10

我们有内部使用的ASP.NET Core应用程序,这些应用程序在办公时间内使用,并且应由HangFire安排,每天早上3点处理此批处理,如下所示:

RecurringJob.AddOrUpdate(
                () => MyBatch(),
                "0 0 3 1/1 *");

问题在于,如果未手动启动网站(通常是通过访问网站),那么应用程序池将进入睡眠状态,并且不会处理该批处理。

我已经搜索了SO,并在应用程序池中篡改了这些设置,但没有成功: enter image description here

一些我用来修改设置的来源:

共有7个应用程序使用了“应用程序池”(在应处理该批处理的夜间,它们都处于非活动状态)。使用的应用程序池使用.NET CLR Version 2.0。 我正在使用IIS版本10.0.17134.1。

如何使应用程序池保持活动状态,以便每天早晨可以定期调用该批处理?

5 个答案:

答案 0 :(得分:1)

他们获得了有关如何设置服务以使其不停止运行的文档。

http://docs.hangfire.io/en/latest/deployment-to-production/making-aspnet-app-always-running.html#enabling-service-auto-start

我的经验(使用较旧的IIS 7.5、8.0版)是有效的,但不适用于应用程序池回收/域卸载。 对我来说,解决方法是在application_end事件上发送初始化请求。

答案 1 :(得分:1)

我遇到了一个同样的问题,即即使使用“ AlwaysRunning”作为应用程序池的启动模式,ASP.NET核心应用程序也进入了空闲状态,该站点的“ Preload Enabled”设置为true,并且空闲超时设置为0。 我通过安装Application Initialization module并将.NET CLR版本设置为v4.0使其工作。不要使用“无托管代码”,因为这将阻止“始终运行”触发应用启动。

我在此上写了blog post,更详细地说明了使应用程序连续运行所采取的步骤。

答案 2 :(得分:0)

如上所述-您需要启用服务自动启动-除此之外,如果遇到多个异常,我发现过去使用HangFire时,Rapid Fail Protection已关闭应用程序池。因此,也有必要在应用程序池上禁用(或增加到合理的限制)。

答案 3 :(得分:0)

我建议您像ping一样,首先将对HTTP地址的单个调用置于进程中,如果由于某种原因它没有运行,则足以触发站点启动。

另一件事是,根据Microsoft在MSDN的描述,“ AlwaysRunning”选项为:

  

”指定Windows进程激活服务(WAS)将   始终启动应用程序池。此行为允许应用程序   在任何服务任何HTTP之前加载操作环境   请求,从而减少了初始HTTP的启动处理   请求该应用程序。”

这可能是为了生成网页的汇编,该汇编是在任何请求到来之前的第一次调用中完成的,但是可能并非始终都在运行该应用程序。

答案 4 :(得分:0)

我在共享IIS主机上,无法访问大多数设置。我所做的是添加了一个定期作业,该作业将在不到IIS超时/空闲的分钟间隔内触发。

RecurringJob.AddOrUpdate<IMyKeepAliveService>("KeepHangFireAlive", svc => svc.KeepHangFireAlive(URL_TO_SELF), "*/4 * * * *");

上面的CRON足以防止IIS App池进入睡眠状态。 我使用RestSharp向“ Self”发出一个很小的ping / GET请求。