.NET6中添加AddCheck健康检查后IHealthCheckPublisher.PublishAsync不触发的解决办法
.NET 6 中添加自定义健康检查后 IHealthCheckPublisher 不触发的解决办法
问题原因
这是 .NET 6 健康检查组件的已知问题:当仅调用 AddHealthChecks() 未添加具体检查项时,框架会默认启用空健康检查并启动后台调度,因此 IHealthCheckPublisher.PublishAsync 能正常执行;但添加自定义检查项后,后台调度逻辑不会自动启动,导致发布方法从未被调用。该问题在 .NET 7 中已被修复。
解决方案
方法一:显式配置健康检查定期调度
通过配置 HealthCheckServiceOptions 指定检查间隔,强制启动后台调度逻辑,让健康检查定期执行并触发发布:
await Host.CreateDefaultBuilder() .ConfigureLogging(loggerBuilder => { loggerBuilder.AddConsole(); }) .ConfigureServices((hostContext, services) => { services.AddHealthChecks() .AddCheck("test", () => HealthCheckResult.Healthy("We're good")); // 配置健康检查的执行间隔,可根据业务需求调整 services.Configure<HealthCheckServiceOptions>(options => { options.Period = TimeSpan.FromSeconds(30); }); services.AddSingleton<IHealthCheckPublisher, SimpleHealthCheckPublisher>(); }).RunConsoleAsync();
方法二:手动触发健康检查(适用于仅需单次执行的场景)
如果不需要定期执行健康检查,仅需在应用启动时执行一次,可以手动调用健康检查并触发发布:
var host = Host.CreateDefaultBuilder() .ConfigureLogging(loggerBuilder => { loggerBuilder.AddConsole(); }) .ConfigureServices((hostContext, services) => { services.AddHealthChecks() .AddCheck("test", () => HealthCheckResult.Healthy("We're good")); services.AddSingleton<IHealthCheckPublisher, SimpleHealthCheckPublisher>(); }).Build(); // 手动执行健康检查并发布结果 var healthCheckService = host.Services.GetRequiredService<IHealthCheckService>(); var publisher = host.Services.GetRequiredService<IHealthCheckPublisher>(); var report = await healthCheckService.CheckHealthAsync(); await publisher.PublishAsync(report, CancellationToken.None); await host.RunConsoleAsync();
内容的提问来源于stack exchange,提问作者RQDQ
相关产品推荐
相关产品推荐

