Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 运行状况检查响应缺少.json扩展名_C#_Asp.net Core_Health Monitoring - Fatal编程技术网

C# 运行状况检查响应缺少.json扩展名

C# 运行状况检查响应缺少.json扩展名,c#,asp.net-core,health-monitoring,C#,Asp.net Core,Health Monitoring,我已与一位响应作者进行了健康检查: services.AddHealthChecks() .AddCheck("My Health Check", new MyHealthCheck(aVariable)); app.UseHealthChecks("/health", new HealthCheckOptions() { ResponseWriter = WriteHealthCheckResponse }); private static Task WriteHealth

我已与一位响应作者进行了健康检查:

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。浏览器无法识别没有扩展名的文件,也不想打开它,因此我想控制文件名

如何控制响应的文件名

更新:

当健康检查通过时,我现在do得到一个health.json文件(可以打开)。 但是,当健康检查失败时,我会得到一个健康文件

尝试下载失败的健康消息(health without.json扩展名),我只得到一个可以打开的部分下载,但保持为空

那么,这段代码中的非快乐流有什么问题

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);}
公共任务CheckHealthAsync(HealthCheckContext上下文,CancellationToken CancellationToken=default(CancellationToken)){ var isHealthy=假; 尝试 { var executionResult=_service.ExecuteExample(); isHealthy=executionResult!=null; } 抓住 { //这不应引发异常。 } HealthCheckResult healthResult=isHealthy ?HealthCheckResult.health(“服务按预期响应”) :HealthCheckResult.unhealth(“服务有问题”); 返回Task.FromResult(healthResult);}
我的代码在同事的机器上运行得很好。 最终看来,Internet Explorer 11是罪魁祸首。在Chrome中,它只起作用

更新和解决方案: 多亏了马丁·利弗塞奇,我找到了答案。 通过在IE中使用F12开发者工具,我发现Unhealth上的HTTP状态代码是503服务不可用。这会阻止IE下载.json结果

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

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

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

“当然,浏览器无法识别没有扩展名的文件。”-您的期望是什么?“不认识”是什么意思?您的意思是它不会提示您下载JSON响应吗?添加到问题:通过控制文件名,浏览器可以识别文件类型并直接打开文件。我的浏览器会很高兴地为我显示JSON。您确定内容类型标题正在生效吗?您只需将.json扩展名添加到浏览器URL中,即可告诉浏览器所需的内容。这在ChromeYou中起作用。您正确地将响应的
内容类型设置为
应用程序/json
。浏览器处理JSON的方式不在您的控制范围之内,但它可能会受到URL(以
.JSON
结尾)的影响,尤其是在扩展映射到应用程序的Windows上。但是,文件扩展名的概念不是HTTP的一部分。也就是说,您可以使用标题指示浏览器使用指定的文件名保存文件。但是,这通常用于下载,而不是JSON响应。这可能是因为IE在没有服务的情况下以失败状态下载请求的结果,我也注意到了这一点,它实际上下载了一个与URL路径同名的文件,在本例中为
healthcheck
。您的成功响应返回一个文件,因此该文件就是下载的文件,
healthcheck.json