如何使IIS中托管的后台服务在服务器空闲时持续运行?
IIS部署后后台服务空闲停止的解决方法
问题根源
IIS应用池默认的空闲超时回收机制会在应用一段时间无请求时终止进程,导致已注册的后台托管服务随之停止。本地运行时应用始终处于活跃状态,不会触发该机制,因此服务能正常运行。
解决方案(符合公司政策限制,无需Windows服务/控制台应用)
1. 调整IIS应用池与网站配置
- 禁用空闲超时
打开IIS管理器,找到目标应用池→右键选择「高级设置」,将「空闲超时(分钟)」设为0(表示永不触发空闲回收)。 - 关闭定期回收
同样在应用池高级设置中,将「定期时间间隔(分钟)」设为0,避免IIS定时终止进程。 - 启用预加载与始终运行模式
- 应用池高级设置里,将「启动模式」改为
AlwaysRunning; - 对应网站的高级设置中,开启「预加载已启用」,确保应用池启动时自动加载应用,无需等待第一个用户请求。
- 应用池高级设置里,将「启动模式」改为
2. 修复代码中的异步问题
你的EmailReminderSenderService中SendEmails方法使用async void会导致异常无法捕获、线程管理失控,建议改为async Task,并调整Timer调用逻辑:
namespace handbook.BackgroundmailService { public class EmailReminderSenderService : IHostedService, IDisposable { public static IConfiguration Configuration { get; set; } private Timer _timer; private readonly IOauthMailService _emailSender; private readonly ILogger<EmailReminderSenderService> _logger; public EmailReminderSenderService(IOauthMailService emailSender, ILogger<EmailReminderSenderService> logger, IServiceProvider serviceProvider, IConfiguration configuration) { _emailSender = emailSender; _logger = logger; Services = serviceProvider; Configuration = configuration; } public IServiceProvider Services { get; } private static TimeSpan getJobRunDelay() { // Change the delay to run every 10 minutes return TimeSpan.FromMinutes(1); } public void Dispose() { _timer?.Dispose(); } public Task StartAsync(CancellationToken cancellationToken) { _logger.LogInformation("后台邮件服务已启动"); // 调整Timer调用,适配异步方法 _timer = new Timer(async _ => await SendEmails(null), null, getJobRunDelay(), getJobRunDelay()); return Task.CompletedTask; } // 修改为async Task方法 private async Task SendEmails(object state) { try { _logger.LogInformation("开始执行邮件提醒任务"); // 你的业务逻辑代码 // 示例:await _emailSender.SendAsync(...); } catch (Exception ex) { _logger.LogError(ex, "邮件提醒任务执行失败"); } } public Task StopAsync(CancellationToken cancellationToken) { _logger.LogInformation("后台邮件服务正在停止"); _timer?.Change(Timeout.Infinite, 0); return Task.CompletedTask; } } }
3. 备选方案(若IIS配置仍不生效)
如果上述配置后仍出现回收问题,可以添加一个简单的健康检查接口(比如/api/health),然后用Windows任务计划创建定时任务,每隔5-10分钟请求一次该接口,强制保持应用进程活跃。
内容的提问来源于stack exchange,提问作者Jojo fever
相关产品推荐
相关产品推荐

