健康检查响应缺少.json扩展名

时间:2019-01-30 07:55:18

标签: c# asp.net-core health-monitoring

我已经使用ResponseWriter实现了健康检查:

services.AddHealthChecks()
    .AddCheck("My Health Check", new MyHealthCheck(aVariable));

app.UseHealthChecks("/health", new HealthCheckOptions()
{
    ResponseWriter = WriteHealthCheckResponse
});

private static Task WriteHealthCheckResponse(HttpContext httpContext, HealthReport result){
httpContext.Response.ContentType = "application/json";

var json = new JObject(
    new JProperty("status", result.Status.ToString()),
    new JProperty("results", new JObject(result.Entries.Select(pair =>
        new JProperty(pair.Key, new JObject(
            new JProperty("status", pair.Value.Status.ToString()),
            new JProperty("description", pair.Value.Description)))))));
return httpContext.Response.WriteAsync(
    json.ToString(Formatting.Indented));}

我希望它返回一个 health.json 文件,但是它只返回 health 。浏览器无法识别没有扩展名的文件,也不想打开它,因此我想控制文件名。

如何控制响应的文件名?

更新

运行状况检查通过后,我现在执行操作,获得一个 health.json 文件(可以打开)。 但是,如果运行状况检查失败,我会得到一个 health 文件。

尝试下载失败的 health 消息(不带.json扩展名的health),我只能部分下载,可以打开,但保持空白。

因此,这段代码中的不愉快流程有什么问题:

public Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default(CancellationToken)){
var isHealthy = false;

try
{
    var executionResult = _service.ExecuteExample();
    isHealthy = executionResult != null;
}
catch
{
    //This should not throw an exception.
}

HealthCheckResult healthResult = isHealthy 
    ? HealthCheckResult.Healthy("The service is responding as expected.") 
    : HealthCheckResult.Unhealthy("There is a problem with the service.");

return Task.FromResult(healthResult);}

1 个答案:

答案 0 :(得分:0)

我的代码在我的同事计算机上运行得很好。 最后,似乎Internet Explorer 11才是罪魁祸首。在Chrome中就可以使用。.

更新和解决方案: 多亏了Martin Liversage,我找到了答案。 通过在IE中使用F12开发人员工具,我发现不正常的HTTP状态代码为 503 Service Unavailable 。这样可以防止IE下载.json结果。

现在,可以通过设置HealthCheckOptions来轻松解决此问题:

app.UseHealthChecks("/health", new HealthCheckOptions()
{
    ResultStatusCodes = { [HealthStatus.Unhealthy] = 200 }, 
    ResponseWriter = WriteHealthCheckResponse
});

如果您基于.json文件的内容集成运行状况检查,请使用此选项。当您只查看HTTP状态时不要。