健康检查,ASP.NET Web API

9
在我的工作中,我被要求在使用C#编写的ASP.NET Web API 2中实现健康检查。我已经搜索过了,但所有文档都是关于ASP.NET Core及其实现方式的,有没有人知道如何在经典/完整的.NET Framework中实现健康检查功能?

1
可能需要创建一个虚拟的可达终点,同时测试依赖的外部资源(如数据库连接)。然后创建一些外部事件(定期和/或手动触发),测试这个终点并报告结果。 - Igor
应用程序的指标具有健康检查。 - Daniel A. White
2个回答

7

我同意Igor的看法。以下是他提出的一个具体应用(显然,还有其他方法可以实现这一点,但这是我知道的保持清晰并尊重关注点分离的最佳方法):

  1. 创建一个新控制器。在此示例中,我将其称为HealthController
  2. 向控制器添加一个操作,并使用[HttpGet]进行注释。
  3. 在操作内部放置逻辑,检查外部依赖项的稳定性。例如,如果磁盘访问对于您的API很关键,请运行一两个测试以确保磁盘的响应符合您的要求。如果您需要能够查询数据库,请进行样本查询,并确保成功。这部分内容完全是定制的,实际上取决于您的API及其执行方式。
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
    }
}
  1. 让外部服务向您的端点发出GET请求(目前位于https://whatever.your.domain.is/Health/Check),并在一段时间内未收到200 OK时报告回来。

我以前用过Amazon CloudWatch并且对它很满意。也会有其他提供同样服务的服务,但我没有使用过。


0

Microsoft.Extensions.Diagnostic.HealthChecks包与.Net Framework兼容,并且可以根据现有文档使用。唯一缺失的部分就是处理请求并运行健康检查的处理程序。

我最近在一个以net472为目标的应用程序中实现了健康检查,具体如下:

  • 按照ASP.Net Core应用程序的文档创建IHealthCheck的实现。
  • 为健康端点添加一个处理程序。在我的情况下,我创建了一个终端的OwinMiddleware:
    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());
        }
    }
    
  • 根据现有文档将健康检查添加到您的DI容器中。在我的情况下,我通过以下方式配置了Autofac:
    var services = new ServiceCollection();
    services.AddHealthChecks().AddCheck<MyHealthCheck>(MyCheck);
    
    builder.Populate(services);
    
    最后一个方法在Autofac.Extensions.DependencyInjection包中。
  • 在应用程序启动时,从DI容器中解析Microsoft.Extensions.Diagnostics.HealthChecks.HealthCheckService的实例,然后调用:
    app.Map("/health", x => x.Use(typeof(HealthCheckHandler), healthCheckService));
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接