在我的工作中,我被要求在使用C#编写的ASP.NET Web API 2中实现健康检查。我已经搜索过了,但所有文档都是关于ASP.NET Core及其实现方式的,有没有人知道如何在经典/完整的.NET Framework中实现健康检查功能?
我同意Igor的看法。以下是他提出的一个具体应用(显然,还有其他方法可以实现这一点,但这是我知道的保持清晰并尊重关注点分离的最佳方法):
public class HealthController : ApiController
{
[HttpGet]
public IHttpActionResult Check()
{
// Add logic here to check dependencies
if (/* successful */)
{
return Ok();
}
return InternalServerError(); // Or whatever other HTTP status code is appropriate
}
}
我以前用过Amazon CloudWatch并且对它很满意。也会有其他提供同样服务的服务,但我没有使用过。
Microsoft.Extensions.Diagnostic.HealthChecks
包与.Net Framework兼容,并且可以根据现有文档使用。唯一缺失的部分就是处理请求并运行健康检查的处理程序。
我最近在一个以net472
为目标的应用程序中实现了健康检查,具体如下:
IHealthCheck
的实现。public class HealthCheckHandler : OwinMiddleware
{
private readonly HealthCheckService _healthCheckService;
public HealthCheckHandler(OwinMiddleware next, HealthCheckService healthCheckService)
: base(next)
{
_healthCheckService = healthCheckService;
}
public override async Task Invoke(IOwinContext context)
{
var report = await _healthCheckService.CheckHealthAsync(context.Request.CallCancelled);
if (report.Status == HealthStatus.Unhealthy)
{
context.Response.StatusCode = (int)HttpStatusCode.ServiceUnavailable;
}
context.Response.ContentType = "application/json";
await context.Response.WriteAsync(report.ToJsonString());
}
}
var services = new ServiceCollection();
services.AddHealthChecks().AddCheck<MyHealthCheck>(MyCheck);
builder.Populate(services);
最后一个方法在Autofac.Extensions.DependencyInjection
包中。Microsoft.Extensions.Diagnostics.HealthChecks.HealthCheckService
的实例,然后调用:
app.Map("/health", x => x.Use(typeof(HealthCheckHandler), healthCheckService));