错误UseHealthChecksUI遇到意外字符

时间:2019-06-10 06:27:09

标签: .net-core health-monitoring

我正在尝试实现ASP.NET Core 2.2运行状况检查功能。设置健康检查本身不是问题,但是我还希望能够使用其他项目中的UI功能来监视我的所有api。现在我收到异常消息

解析值<。

时遇到意外字符

我在做什么不好?

API项目:

var healthCheckOptions = new HealthCheckOptions
{
Predicate = _ => true,
ResponseWriter = async (c, r) =>
{
    c.Response.ContentType = MediaTypeNames.Application.Json;
    var result = JsonConvert.SerializeObject(
        new
        {
            Checks = r.Entries.Select(e =>
                new
                {
                    Description = e.Key,
                    Status = e.Value.Status.ToString(),
                    ResponseTime = e.Value.Duration.TotalMilliseconds
                }),
            TotalResponseTime = r.TotalDuration.TotalMilliseconds
        });
    await c.Response.WriteAsync(result);
 }
};

app.UseHealthChecks("/live", new HealthCheckOptions
{
  Predicate = _ => true
});
app.UseHealthChecks("/hc", healthCheckOptions);
app.UseHealthChecksUI(options => options.UIPath = "/healtcheck");

// Registers required services for health checks
services
   .AddHealthChecks()
   .AddCheck("self", () => HealthCheckResult.Healthy())
   .AddCheck("ComunContext Database", new   SqlServerHealthCheck(configuration["ConnectionStrings:ComunContext"]));

Web项目:

services.AddHealthChecksUI();

app.UseHealthChecksUI(config =>
{
    config.UIPath = "/healthcheck";
});

appsettings.json
{
  "HealthChecks-UI": {
  "HealthChecks": [
  {
    "Name": "Local",
    "Uri": "http://localhost:27365/hc"
  }
],
"EvaluationTimeOnSeconds": 10,
"MinimumSecondsBetweenFailureNotifications": 60
 }
}

2 个答案:

答案 0 :(得分:0)

尝试添加ResponseWriter:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{      
    app.UseHealthChecks("/healthchecks", new HealthCheckOptions
    {
        ResponseWriter = async (context, report) =>
        {
            context.Response.ContentType = "application/json; charset=utf-8";
            var bytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(report));
            await context.Response.Body.WriteAsync(bytes);
        }
    });
    app.UseHealthChecksUI();
}

答案 1 :(得分:0)

在为这个解析器错误苦苦挣扎了几天之后,我发现有两个问题: 1 - 如果您有异常,Health UI 会尝试转换异常对象字段,从而导致错误; 2 - 如果您尝试传递自己的匿名对象,Health UI 将无法转换 Entries 集合,因为它需要是特定的匿名字典

试试这个:

    var healthCheckOptions = new HealthCheckOptions
    {
        Predicate = _ => true,
        ResponseWriter = async (c, r) =>
        {
        c.Response.ContentType = MediaTypeNames.Application.Json;
        var result = JsonConvert.SerializeObject(
            new
            {
                Checks = r.Entries.ToDictionary(
                    e => e.Key,
                    e =>
                    new
                    {
                        Description = e.Key,
                        Status = e.Value.Status.ToString(),
                        ResponseTime = e.Value.Duration.TotalMilliseconds
                    }),
                TotalResponseTime = r.TotalDuration.TotalMilliseconds
            });
        await c.Response.WriteAsync(result);
        }
    };