IIS 10应用程序池进入睡眠状态

IIS 10应用程序池进入睡眠状态,iis,iis-10,Iis,Iis 10,我们在内部使用ASP.NET核心应用程序,这些应用程序在办公时间内使用,每天凌晨3点应处理一批应用程序,由HangFire安排,如下所示: RecurringJob.AddOrUpdate( () => MyBatch(), "0 0 3 1/1 *"); 问题是,如果站点没有手动启动(通常通过访问网站),应用程序池将进入睡眠状态,批处理将不会得到处理 我已搜索SO并在应用程序池中篡改了这些设置,但未成功: 我用来修改设置

我们在内部使用ASP.NET核心应用程序,这些应用程序在办公时间内使用,每天凌晨3点应处理一批应用程序,由HangFire安排,如下所示:

RecurringJob.AddOrUpdate(
                () => MyBatch(),
                "0 0 3 1/1 *");
问题是,如果站点没有手动启动(通常通过访问网站),应用程序池将进入睡眠状态,批处理将不会得到处理

我已搜索SO并在应用程序池中篡改了这些设置,但未成功:

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

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


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

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

我的经验(使用旧版IIS 7.5、8.0)是,它可以工作,但不适用于应用程序池回收/域卸载。
我的解决方法是在应用程序结束事件上发送init请求。

如上所述-您需要启用服务自动启动-此外,如果遇到多个异常,我发现快速故障保护在过去使用HangFire时已关闭应用程序池。因此,在应用程序池中禁用(或增加到合理的限制)此功能也是值得的。

我建议您首先在流程中对HTTP地址进行一次调用,就像ping一样,如果由于某种原因没有运行,这将足以触发站点启动

另一件事是,根据微软的描述,“AlwaysRunning”选项是:

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


这可能是为了生成在任何请求到来之前的第一次调用中完成的网页编译,但可能不会始终实际运行应用程序。

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


我在上面写了一篇文章,详细解释了让应用程序持续运行的步骤

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

RecurringJob.AddOrUpdate<IMyKeepAliveService>("KeepHangFireAlive", svc => svc.KeepHangFireAlive(URL_TO_SELF), "*/4 * * * *");
RecurringJob.AddOrUpdate(“KeepHangFireAlive”,svc=>svc.KeepHangFireAlive(URL指向自身),“*/4****”;
上述CRON足以防止IIS应用程序池进入睡眠状态。
我使用RestSharp向“Self”发出一个小小的ping/GET请求。

根据我的理解,您的设置应该可以工作。您是否尝试将其移动到自己的应用程序池中?谢谢您的评论@pieterlberts!我现在已经为此应用程序创建了一个新的应用程序池(AP)。我注意到上一个AP上的
.NET CLR版本是
2.0
。我不确定这是否有什么区别,但根据我的经验,我可以对核心应用程序使用
No managed code
,我将在本AP中测试这些应用程序,并对其进行与前一AP相同的更改。@Pieterlberts将站点移动到自己的AP时运气不佳=/这真是糟糕透了。好吧,我是新的想法。。。如果你真的需要解决这个问题,也许可以在你的问题上增加+50奖金?在这一点上,他们解释说,
Kestrel
进程在
IIS
应用程序池被回收时被终止,
IIS
可能会重新开始,但对于
Kestrel
来说,这只是在新请求出现时(通过
IIS
)。除了建议您将应用程序移动到调度程序或windows服务之外,同时作为一种快速而肮脏的解决方法,您可能会安排一个
CURL
PowerShell
脚本,在所需的时间向您的网站发出web请求,作为“唤醒电话”。我们最终将核心应用程序作为windows服务托管,不是作为IIS应用程序,用应用程序重启解决此问题在我的情况下,它是web应用程序的一部分,因此在上面的结尾解决了一个问题。感谢您的回答,我现在实施了更改并进行了测试!将.NET CLR版本设置为v4.0修复了我的问题。