【发布时间】:2018-12-23 05:03:36
【问题描述】:
我们有内部使用的 ASP.NET Core 应用程序,在办公时间使用,还有一个批处理应该在每天早上 3 点处理,由HangFire 安排,如下所示:
RecurringJob.AddOrUpdate(
() => MyBatch(),
"0 0 3 1/1 *");
问题是应用程序池进入睡眠状态,如果站点没有手动启动(通常通过访问该网站),批处理不会被处理。
我搜索了 SO 并在应用程序池中篡改了这些设置,但没有成功:
我用来修改设置的一些来源:
- How to prevent/extend idleTimeout in IIS 7?
- https://serverfault.com/questions/443065/how-do-i-prevent-iis-8-from-stopping-idle-asp-net-applications
- IIS seems like to sleep until the next request
应用程序池总共被 7 个应用程序使用(在应该处理批处理的夜间,所有应用程序都处于非活动状态)。使用的应用程序池使用.NET CLR Version 2.0。
我使用的是 IIS 版本 10.0.17134.1。
如何使应用程序池保持活动状态,以便每天早上定期调用批处理?
【问题讨论】:
-
据我了解,您的设置应该可以工作。您是否尝试过将其移至自己的应用程序池?
-
感谢您的评论@PieterAlberts!我现在为此应用程序创建了一个新的应用程序池 (AP)。我注意到之前 AP 上的
.NET CLR Version是2.0。我不确定这是否有任何区别,但根据stackoverflow.com/questions/49185512/…,我可以将No managed code用于核心应用程序,我将在此AP 中测试这些应用程序以及与之前AP 中相同的更改。 -
@PieterAlberts 将站点移至其自己的 AP 时运气不佳 =/
-
这真的很糟糕。好吧,我的想法很新鲜......如果你真的需要解决这个问题,可以为你的问题添加 +50 赏金?
-
在这个post 他们解释说
Kestrel进程在IIS应用程序池被回收时被杀死并且IIS可能会重新启动,但对于Kestrel这只是当有新请求进来时(通过IIS)。除了建议将您的应用程序移动到调度程序或 Windows 服务之外,与此同时,作为一种快速而肮脏的解决方法,您可以安排CURL或PowerShell脚本向您的网站将所需时间作为“唤醒电话”。