c# - .NET Core Healthchecks UI 未显示

标签 c# asp.net-core health-check

我正在使用 .NET Core 3.1 并尝试设置运行状况检查,但遇到了一个奇怪的问题,需要一些帮助。

当我转到基本健康检查 URL (https://localhost:5001/hc) 时,我得到以下信息:

{
  "status": "Healthy",
  "errors": [
    {
      "key": "AssessmentContext",
      "value": "Healthy"
    }
  ]
}

看起来不错!但是,当我尝试转到 UI 时,它说应用程序运行状况不佳。

UI error

所以它正确地提取了端点名称,但没有正确注册它。

我的 startup.cs 文件如下所示:

public void ConfigureServices(IServiceCollection services) {
    ...

    services
        .AddHealthChecks()
        .AddDbContextCheck<AssessmentContext>();

    services.AddHealthChecksUI(opt => {
        opt.SetEvaluationTimeInSeconds(30);
        opt.MaximumHistoryEntriesPerEndpoint(60);

        opt.AddHealthCheckEndpoint(name: "app", uri: "~/hc");
    }).AddInMemoryStorage();

}

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

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHealthChecks("/hc", new HealthCheckOptions
        {
            Predicate = _ => true,
            ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse,
        });

        endpoints.MapHealthChecksUI(opt => {
            opt.UseRelativeApiPath = false;
            opt.UseRelativeResourcesPath = false;
            opt.AsideMenuOpened = false;

            opt.UIPath = "/health";
            opt.ApiPath = "/healthAPI";
        });


        ...
    });
}

并且 csproj 文件具有以下版本:

<PackageReference Include="AspNetCore.HealthChecks.UI" Version="3.1.1" />
<PackageReference Include="AspNetCore.HealthChecks.UI.Client" Version="3.1.1" />
<PackageReference Include="AspNetCore.HealthChecks.UI.InMemory.Storage" Version="3.1.1" />
<PackageReference Include="AspNetCore.HealthChecks.System" Version="3.1.2" />
<PackageReference Include="Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore" Version="3.1.8" />
<PackageReference Include="AspNetCore.HealthChecks.MySql" Version="3.1.1" />

HealthChecks.UI.Core.HostedService.HealthCheckReportCollector: Error: GetHealthReport threw an exception when trying to get report from ~/hc configured with name app.

System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.
 ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.
   at System.Net.Security.SslStream.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, ExceptionDispatchInfo exception)
   at System.Net.Security.SslStream.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslStream.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslStream.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslStream.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslStream.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslStream.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslStream.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslStream.PartialFrameCallback(AsyncProtocolRequest asyncRequest)
--- End of stack trace from previous location where exception was thrown ---
   at System.Net.Security.SslStream.EndProcessAuthentication(IAsyncResult result)
   at System.Net.Security.SslStream.EndAuthenticateAsClient(IAsyncResult asyncResult)
   at System.Net.Security.SslStream.<>c.<AuthenticateAsClientAsync>b__65_1(IAsyncResult iar)
   at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
--- End of stack trace from previous location where exception was thrown ---
   at System.Net.Http.ConnectHelper.EstablishSslConnectionAsyncCore(Stream stream, SslClientAuthenticationOptions sslOptions, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at System.Net.Http.ConnectHelper.EstablishSslConnectionAsyncCore(Stream stream, SslClientAuthenticationOptions sslOptions, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean allowHttp2, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.GetHttpConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)
   at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at Microsoft.Extensions.Http.Logging.LoggingHttpMessageHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at Microsoft.Extensions.Http.Logging.LoggingScopeHttpMessageHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpClient.FinishSendAsyncBuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)
   at HealthChecks.UI.Core.HostedService.HealthCheckReportCollector.GetHealthReport(HealthCheckConfiguration configuration)

最佳答案

我希望您已经找到了解决方案。但是由于这个问题仍然没有答案,这也是我面临的一个问题,所以我将发布我是如何解决它的,希望将来能帮助别人。谢谢。

public void ConfigureServices(IServiceCollection services)
{
    services.AddHealthChecks()
            .AddCheck("Products", new SqlServerHealthCheck(connectionString))
            .AddSqlServer(connectionString, name: "DataBase");
            
    services.AddHealthChecksUI(setup =>
    {
        setup.UseApiEndpointHttpMessageHandler(sp =>
        {
            return new HttpClientHandler
            {
                ClientCertificateOptions = ClientCertificateOption.Manual,
                ServerCertificateCustomValidationCallback = (httpRequestMessage, cert, cetChain, policyErrors) => { return true; }
            };
        });
    }).AddInMemoryStorage();
}        

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IApiVersionDescriptionProvider provider)
{
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
        endpoints.MapHealthChecks("/api/hc", new HealthCheckOptions
        {
            Predicate = _ => true,
            ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
        });
        endpoints.MapHealthChecksUI();
        
    });
}

关于c# - .NET Core Healthchecks UI 未显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64125504/

相关文章:

c# - 如何在 ASP.NET 中的运行状况检查返回 'degraded'/'unhealthy' 时发送电子邮件警报

c# - 使用 X509 证书从 XML 文件中提取公钥?

c# - Jwt 无法有效发布者或受众

c# - 使用 C# 验证 Google id token

c# - 如何将文件上传到 blob 存储并从附件中的 cosmosdb 文档引用它

c# - 使用 nameof() 获取 ModelState.AddModelError() 的属性路径

python - gRPC HealthCheck 报告服务,即使它被定义为 NOT_SERVING

c# - 健康检查,ASP.NET Web API

c# - 如果我的传入日期格式为 YYYYMMDD,则在 .NET 中将字符串转换为日期

c# - 如何在回发后维护 Tab 键顺序