【发布时间】:2022-01-06 18:58:09
【问题描述】:
我创建了一个调用注入服务的自定义运行状况检查,该服务使用 DbContext 来查询数据库以获取一些信息。当我启动我的应用程序时,我收到以下错误:
在配置时尝试使用上下文。一种 DbContext 实例不能在 OnConfiguring 内部使用,因为它是 此时仍在配置中。如果一秒钟就会发生这种情况 操作在前一个操作之前在此上下文中启动 完全的。不保证任何实例成员都是线程安全的。
有没有办法延迟健康检查,直到 DbContext 在启动时的某个地方注册?
下面是我的健康检查实现。
public class HealthCheck : IHealthCheck
{
public Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default(CancellationToken))
{
int userCount = dbService.GetUserCount(); // fails in the dbService here
if (userCount > 0)
return Task.FromResult(HealthCheckResult.Healthy("A healthy result."));
return Task.FromResult(new HealthCheckResult(context.Registration.FailureStatus, "An unhealthy result."));
}
}
这是我的dbcontext通过AddDbContext注册后在启动时的注册方式
services.AddHealthChecks().AddCheck<HealthCheck>("user_health_check");
【问题讨论】:
-
何时失败、应用程序加载或您何时请求健康检查端点?
-
你是如何获得你的数据库上下文的?服务范围有吗?您是否有任何单例服务在不创建新范围的情况下获取上下文?
-
@SBI 两者兼有——健康检查端点在应用程序加载期间启动——全部在启动时的 ConfigureServices 方法中
-
@JeremyLakeman 是的,数据库上下文已注入。单例服务不支持。
-
您还可以探索使用 MapWhen 来限制仅在请求时激活运行状况检查中间件。更多信息here.
标签: c# asp.net-core entity-framework-core health-check