ASP.NET Core健康检查是监控应用状态的轻量机制,需配置检查项、暴露端点并按场景定制;支持就绪/存活区分、自定义检查及K8s/Prometheus集成。

ASP.NET Core 的健康检查(Health Checks)是监控应用运行状态的轻量级机制,能快速识别服务是否就绪、是否存活、依赖是否可用。它不复杂但容易忽略细节,关键是配置好检查项、暴露端点、并结合实际场景定制逻辑。
启用健康检查中间件
在 Program.cs 中注册健康检查服务并添加中间件:
- 调用 AddHealthChecks() 注册服务,可链式添加各种检查器(如数据库、HTTP、磁盘等)
- 调用 MapHealthChecks() 暴露 HTTP 端点,支持自定义路径、响应格式和授权
示例:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHealthChecks()
.AddSqlServer(connectionString: "Server=...;Database=Test;...")
.AddRedis("localhost:6379", name: "redis-cache")
.AddProcessHostedServiceCheck(); // 自定义检查:确认后台服务是否启动
var app = builder.Build();
app.MapHealthChecks("/health", new HealthCheckOptions
{
ResponseWriter = async (ctx, report) =>
{
ctx.Response.ContentType = "application/json";
await JsonSerializer.SerializeAsync(ctx.Response.Body, report, new JsonSerializerOptions { WriteIndented = true });
}
});
定义自定义健康检查
当内置检查器不满足需求时(比如检查第三方 API 可用性、文件写入权限、配置有效性),可实现 IHealthCheck 接口:
- 重写 CheckHealthAsync 方法,执行检测逻辑
- 返回 HealthCheckResult.Healthy()、.Unhealthy() 或 .Degraded()
- 可传入描述、异常、数据字典(用于输出诊断信息)
例如检查某个配置项是否存在:
public class ConfigHealthCheck : IHealthCheck
{
private readonly IConfiguration _config;
public ConfigHealthCheck(IConfiguration config) => _config = config;
public Task CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
{
var value = _config["ExternalApi:BaseUrl"];
return Task.FromResult(string.IsNullOrWhiteSpace(value)
? HealthCheckResult.Unhealthy("External API base URL is missing.")
: HealthCheckResult.Healthy());
}
}
然后注册:services.AddHealthChecks().AddCheck
区分就绪(Ready)与存活(Live)检查
生产中常需两类检查:
- /health/live:只判断进程是否存活(如未崩溃、未被 SIGTERM 中断),通常用 AddLivenessCheck 或简单返回 Healthy
- /health/ready:判断是否已准备好接收流量(如数据库连通、缓存加载完成、后台任务初始化完毕)
ASP.NET Core 不自带 Live/Ready 区分,但可通过不同端点 + 不同检查集合实现:
app.MapHealthChecks("/health/live", new HealthCheckOptions
{
Predicate = _ => true // 所有检查都跳过,或只挂一个空检查
});
app.MapHealthChecks("/health/ready", new HealthCheckOptions
{
Predicate = reg => reg.Tags.Contains("ready") // 只执行带 "ready" 标签的检查
});
// 注册时打标签
services.AddHealthChecks()
.AddSqlServer(connStr, tags: new[] { "ready" })
.AddCheck("startup-task", tags: new[] { "ready" });
集成到 Kubernetes 或 Prometheus
K8s 的 liveness/readiness 探针可直接对接上述端点;Prometheus 则需启用指标导出:
- 安装 AspNetCore.HealthChecks.Prometheus.Metrics 包
- 调用 AddPrometheusExporter() 并映射 /metrics
- 健康检查结果会自动转为 Prometheus 格式指标(如 healthcheck_status{check="sql",status="healthy"} 1)
注意:Prometheus 端点默认不启用认证,上线前建议加中间件限制访问来源。
基本上就这些。关键不是堆功能,而是按环境选检查项、合理打标签、让返回信息对运维真正有用。










