如何为ASP.NET Core Minimal API Windows服务实现暂停/继续功能?
在ASP.NET Core Windows服务中实现暂停/继续自定义逻辑
完全可行,你可以通过实现IHostedService并监听Windows服务特有的生命周期事件来实现自定义暂停/继续逻辑,具体步骤如下:
1. 创建自定义服务处理类
实现IHostedService接口,注入WindowsServiceLifetime来订阅暂停和继续事件:
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting.WindowsServices; using Microsoft.Extensions.Logging; public class WindowsServiceEventHandler : IHostedService { private readonly ILogger<WindowsServiceEventHandler> _logger; private readonly WindowsServiceLifetime? _windowsLifetime; public WindowsServiceEventHandler(ILogger<WindowsServiceEventHandler> logger, IHostLifetime lifetime) { _logger = logger; _windowsLifetime = lifetime as WindowsServiceLifetime; } public Task StartAsync(CancellationToken cancellationToken) { if (_windowsLifetime != null) { _windowsLifetime.Pausing += OnServicePausing; _windowsLifetime.Continuing += OnServiceContinuing; } return Task.CompletedTask; } public Task StopAsync(CancellationToken cancellationToken) { if (_windowsLifetime != null) { _windowsLifetime.Pausing -= OnServicePausing; _windowsLifetime.Continuing -= OnServiceContinuing; } return Task.CompletedTask; } private void OnServicePausing(object? sender, EventArgs e) { // 写入你的暂停自定义逻辑 _logger.LogInformation("Windows服务正在执行暂停操作"); // 示例:停止后台任务、释放临时资源、关闭非必要连接等 } private void OnServiceContinuing(object? sender, EventArgs e) { // 写入你的继续自定义逻辑 _logger.LogInformation("Windows服务正在执行恢复操作"); // 示例:重启后台任务、重新初始化资源、恢复连接等 } }
2. 注册自定义服务
在Program.cs中将自定义服务添加到依赖注入容器:
var builder = WebApplication.CreateBuilder(); builder.Host.UseWindowsService(); // 注册自定义的Windows服务事件处理服务 builder.Services.AddHostedService<WindowsServiceEventHandler>(); var app = builder.Build(); app.MapGet("/hello", () => "Hello World"); app.Run();
3. 确保依赖包存在
如果项目未自动引用Microsoft.Extensions.Hosting.WindowsServices包,需通过NuGet安装:
Install-Package Microsoft.Extensions.Hosting.WindowsServices
注意事项
- 当Windows服务被暂停时,默认不会自动停止API的请求处理,若需要暂停期间拒绝请求,可在
OnServicePausing中添加逻辑(比如关闭HTTP端点、添加中间件拦截请求)。 - 事件处理逻辑应尽量轻量化,避免长时间阻塞,影响服务的暂停/继续响应速度。
内容的提问来源于stack exchange,提问作者Skorraxx
相关产品推荐
相关产品推荐

