如何从数据库为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
相关产品推荐
相关产品推荐

