2

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

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

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

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

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

谢谢

4

2 回答 2

7

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

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

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

于 2020-01-28T13:56:32.310 回答
2

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

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

于 2020-01-28T13:30:02.847 回答