.NET Core中提供了开箱即用的运行情况检查,首先,我将在.NET Core API应用程序中执行运行情况检查,接下来,咱们将使用DbContext集成SQL Server或数据库的运行情况检查,最后是如何实现自定义服务的运行情况检查。数据库
要实现运行情况检查,您须要在项目中安装 Microsoft.AspNetCore.Diagnostics.HealthChecks
。api
接下来,在ConfigureServices
方法中添加运行情况检查中间件。app
public void ConfigureServices(IServiceCollection services) { services.AddHealthChecks(); services.AddControllers(); }
而后修改Configure
方法,使用中间件:async
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseEndpoints(endpoints => { endpoints.MapControllers(); endpoints.MapHealthChecks("/health"); }); }
如今,准备工做完成,运行程序而后访问 /health, 您将看到下边结果:ui
.NET Core提供了一个HealthCheckService类,咱们能够把健康检查的放到咱们的控制器中,就像这样:.net
public class HealthController : ControllerBase { private readonly ILogger<HealthController> _logger; private readonly HealthCheckService _healthCheckService; public HealthController(ILogger<HealthController> logger, HealthCheckService healthCheckService) { _healthCheckService = healthCheckService; _logger = logger; } [HttpGet] public async Task<IActionResult> Get() { var report = await _healthCheckService.CheckHealthAsync(); return report.Status == HealthStatus.Healthy ? Ok(report) : StatusCode((int)HttpStatusCode.ServiceUnavailable, report); } }
如今,若是您尝试访问/health,您将看到相同的结果。3d
接下来,咱们将实现数据库运行状态检查:code
首先,仍是须要安装Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore
到咱们的项目中。中间件
接下来,咱们拿到数据库上下文,而后修改代码:blog
public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddApiVersioning(); }
而后,运行程序,如今访问 /health 返回的结果是这样:
一些状况下,默认的健康检查可能不知足咱们的需求,那么能够继承 IHealthCheck 接口,自定义咱们的健康检查的逻辑。
public class ApiHealthCheck : IHealthCheck { private readonly IHttpClientFactory _httpClientFactory; public ApiHealthCheck(IHttpClientFactory httpClientFactory) { _httpClientFactory = httpClientFactory; } public async Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default) { using (var httpClient = _httpClientFactory.CreateClient()) { var response = await httpClient.GetAsync("https://your-api-service.endpoint"); if (response.IsSuccessStatusCode) { return HealthCheckResult.Healthy($"API is running."); } return HealthCheckResult.Unhealthy("API is not running"); } } }
而后修改代码以下:
public void ConfigureServices(IServiceCollection services) { services.AddHealthChecks() .AddDbContextCheck<WeatherForecastDbContext>() .AddCheck<ApiHealthCheck>("ApiHealth"); services.AddControllers(); }
而后,运行程序,访问 /health,结果以下:
原文做者: Anuraj
原文连接: https://dotnetthoughts.net/implementing-health-check-aspnetcore/