防止 IIS 在运行后台任务时出现空闲超时

Wij*_*tha 2 asp.net iis .net-core asp.net-core asp.net-core-hosted-services

在我们的 ASP.Net Core Web API 中,我们曾经Hosted Services执行过一些后台任务。有时这些后台任务可能需要很长时间才能完成(大约一个小时)。除非有长时间运行的任务,否则一切都可以无缝运行。

IIS 应用程序池的空闲超时默认值为 20 分钟。因此,当 20 分钟内没有请求时,IIS 会重新启动应用程序池。但有时后台任务可能会运行并且 IIS 重新启动,而不管它是否会导致任务突然终止而没有将其标记为完成。一旦 IIS 启动,托管服务启动处理就会再次选取任务。但在完成之前,IIS 会重新启动,并且这种情况可能会一直持续下去。当存在可能多次发送相同电子邮件的电子邮件发送任务时,这可能会导致许多问题。

由于托管服务是 ASP.NET Core 的一等公民,如果 IIS 在执行空闲超时时也考虑后台执行,那将是理想的。

现在我们通过将空闲超时设置为 0 来解决这个问题,这样它就永远不会超时。这是一种hacky解决方案。此外,在节点动态添加和删除的负载平衡环境中,这不是一个可行的选择。

有没有更好的方法来“防止 IIS 在后台执行过程中重新启动”?

谢谢

小智 5

考虑使用专为此类任务设计的Hangfire。目前,您可以将 IIS 配置为始终运行该站点。

  1. 右键单击站点名称 > 管理网站 > 高级 > 确保预加载设置为 true。

  2. 右键单击应用程序池 > 高级设置 > 空闲超时(分钟)为 0,启动模式为始终运行。


小智 2

我不知道你的设置,但也许你省略了 IIS 并使用了 Kestrel 之类的东西。

另外,我不会将运行时间很长的任务(例如发送电子邮件)放在 IIS 进程中运行。而是将其放入另一个进程(例如控制台应用程序)中,并让 apsnetcore 应用程序为用户提供请求。