我们有内部使用的ASP.NET Core应用程序,这些应用程序在办公时间内使用,并且应由HangFire
安排,每天早上3点处理此批处理,如下所示:
RecurringJob.AddOrUpdate(
() => MyBatch(),
"0 0 3 1/1 *");
问题在于,如果未手动启动网站(通常是通过访问网站),那么应用程序池将进入睡眠状态,并且不会处理该批处理。
我已经搜索了SO,并在应用程序池中篡改了这些设置,但没有成功:
一些我用来修改设置的来源:
共有7个应用程序使用了“应用程序池”(在应处理该批处理的夜间,它们都处于非活动状态)。使用的应用程序池使用.NET CLR Version
2.0
。
我正在使用IIS版本10.0.17134.1。
如何使应用程序池保持活动状态,以便每天早晨可以定期调用该批处理?
答案 0 :(得分:1)
他们获得了有关如何设置服务以使其不停止运行的文档。
我的经验(使用较旧的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请求。