You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 22:55:18