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

如何从数据库为HealthChecks UI添加端点条目?

解决HealthChecks UI从数据库添加条目时的解析错误问题

我正在使用AspNetCore.Diagnostics.HealthChecks库,在ConfigureServices中通过以下代码注册时运行正常:

services.AddHealthChecksUI(setupSettings: setup =>
{
    setup.AddHealthCheckEndpoint("Test", "https://myDoman/healthz");
    setup.AddHealthCheckEndpoint("Test DB", "https://myDoman/healthz-db");
}).AddInMemoryStorage();

但当我尝试在Configure方法中从数据库获取配置添加条目时:

public void Configure(IApplicationBuilder app, IDbService dbService, HealthChecksDb healthChecksDb)
{
    // 从dbService获取NameFromDB和UrlFromDB
    // ...省略获取逻辑...
    healthChecksDb.Configurations.Add(new HealthCheckConfiguration
    {
        Name = NameFromDB,
        Uri = UrlFromDB,
    });
    healthChecksDb.SaveChanges(); 
}

UI出现错误:Unexpected character encountered while parsing value: <. Path '', line 0, position 0.

正确实现方式

1. 替换内存存储为持久化数据库存储

当前使用的AddInMemoryStorage()会导致配置仅存在于内存中,和你写入的数据库实例不兼容。需要换成对应数据库的存储提供者,比如SQL Server:

// ConfigureServices中修改存储配置
services.AddHealthChecksUI()
    .AddSqlServerStorage("YourConnectionString"); // 替换为实际数据库连接字符串

2. 不在Configure方法中直接初始化配置

Configure方法用于配置中间件管道,不适合执行数据初始化操作。建议在应用启动后通过作用域服务完成配置写入:

var app = builder.Build();

// 初始化HealthCheck配置
using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;
    var dbService = services.GetRequiredService<IDbService>();
    var healthChecksDb = services.GetRequiredService<HealthChecksDb>();

    // 从业务数据库获取配置信息
    var nameFromDB = dbService.GetHealthCheckName();
    var urlFromDB = dbService.GetHealthCheckUrl();

    // 避免重复添加相同配置
    if (!healthChecksDb.Configurations.Any(c => c.Name == nameFromDB))
    {
        healthChecksDb.Configurations.Add(new HealthCheckConfiguration
        {
            Name = nameFromDB,
            Uri = urlFromDB,
        });
        healthChecksDb.SaveChanges();
    }
}

// 配置HealthChecks UI中间件
app.UseHealthChecksUI();

// 其他中间件配置...
app.Run();

3. 确保健康检查端点返回正确JSON格式

错误中的<符号通常表示UI请求端点时得到了HTML(比如错误页面)而非JSON。需要配置健康检查端点返回符合UI要求的JSON格式:

app.UseHealthChecks("/healthz", new HealthCheckOptions
{
    ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
});

app.UseHealthChecks("/healthz-db", new HealthCheckOptions
{
    ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
});

4. 验证数据库中配置的Uri有效性

确认写入HealthChecksDb的Uri是可正常访问的地址,对应的端点能返回合法的健康检查JSON结果。如果地址错误或端点不可用,UI会收到错误页面HTML,进而触发解析失败。

内容的提问来源于stack exchange,提问作者Imran Qadir Baksh - Baloch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 20:43:10