Проверка работоспособности ASP.NET EF Core ничего не возвращает, кроме состояния 200

В настоящее время я выполняю проверку работоспособности своего проекта Identity ASP.NET Core 3.1 с использованием PostgreSQL и EntifyFramework Core в контейнере Docker.

Это пакеты nuget, установленные в моем проекте

  • Microsoft.EntityFrameworkCore 3.1.3
  • Npgsql.EntityFrameworkCore.PostgreSQL 3.1.3
  • Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore3.1.3
  • Microsoft.AspNetCore.Identity.EntityFrameworkCore 3.1.3

Вот мой класс Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<IdentityContext>(options => options.UseNpgsql(Configuration["Identity:ConnectionString"]));

    services.AddHealthChecks()
            .AddDbContextCheck<IdentityContext>("Database");

    services.AddControllers();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseHealthChecks("/health");
    app.UseHttpsRedirection();

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
       endpoints.MapControllers();
    });   
}

Все работает нормально, я получаю ответ Healthy с кодом состояния 200, обращаясь к конечной точке /health, пока я намеренно не остановлю контейнер PostgreSQL в моем докере.

Я ожидаю получить код состояния 503 с ответом "Неработоспособный" от /health, но вместо этого получил пустой ответ с кодом состояния 200

Вот снимок результата от почтальона

1 ответ

Я думаю, что ваша проверка "База данных" не вызывается, когда вы запрашиваете URL "/ здоровье". Попробуйте зарегистрировать HealthCheck с помощью тега. Затем определите enpoint с этим тегом.

      public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<IdentityContext>(options => options.UseNpgsql(Configuration["Identity:ConnectionString"]));

    services.AddHealthChecks()
            .AddDbContextCheck<IdentityContext>("Database",tags: new[] { "live" });

    services.AddControllers();
}


public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{       
    app.UseHttpsRedirection();

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
       endpoints.MapControllers();

       endpoints.MapHealthChecks("/health/live", new HealthCheckOptions()
            {
                Predicate = (check) => check.Tags.Contains("live") 
            });
    });   
}

Вы можете прочитать о проверке здоровья здесь

Другие вопросы по тегам