【问题标题】:Writing custom 500 response body works with IIS Express, but fails on IIS ASP.Net Core 1.0编写自定义 500 响应正文适用于 IIS Express,但在 IIS ASP.Net Core 1.0 上失败
【发布时间】:2016-07-06 20:04:07
【问题描述】:

我正在开发一个 ASP.Net Core 1.0(发布)API 项目。
我编写了一个自定义异常过滤器来记录并向调用者返回标准错误。在 IIS-Express 下一切正常。我得到 500 响应代码和自定义 json 对象。但是,当我部署到完整的 IIS 服务器时,我没有得到任何响应。错误被记录,但响应永远不会发送回客户端。这对我来说是个谜。

这里是异常过滤器:

public async Task OnExceptionAsync(ExceptionContext context)
{
    Exception ex = context.Exception;
    string message = string.Empty;
    int incidentId = 0;

        string parameters = string.Empty;
        if (ex is NotifyingException)
        {
            parameters = Newtonsoft.Json.JsonConvert.SerializeObject(((NotifyingException)ex).NotificationData);
        }
        incidentId = await Logger.LogIncidentAsync(context.HttpContext.Request.Path, ex, parameters);
        message = string.Format(ValidationResources.OperationFailed, incidentId);

    string msg = Newtonsoft.Json.JsonConvert.SerializeObject(new { message = message, incidentId = incidentId });
    byte[] bytes = Encoding.UTF8.GetBytes(msg);

    context.HttpContext.Response.StatusCode = StatusCodes.Status500InternalServerError;
    await context.HttpContext.Response.Body.WriteAsync(bytes, 0, bytes.Length);
}

在 startup.cs 中,我正在添加过滤器 (IncidentExceptionFilter),如下所示:

    services.AddMvc(config =>
    {
        var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
        config.Filters.Add(new AuthorizeFilter(policy));
        config.Filters.Add(new ClaimsAuthorizationFilter());
        config.Filters.Add(new CorsAuthorizationFilterFactory("AllowAll"));
        config.Filters.Add(typeof(IncidentExceptionFilter));
    }
    );

我有一个简单的测试页面,它只是抛出一个异常来测试。 这是我在 IIS 上运行时使用 Postman 得到的结果:

完美。正是我所期望的。但是,在完整的 IIS 下,Postman 说:“计数没有得到任何响应”。 API 的其余部分工作正常,并且日志被写入,所以它进入过滤器,只是什么都没有出来......

【问题讨论】:

  • 很奇怪。顺便说一句,您可以在异常过滤器中执行此操作,并避免显式编写。试一试,看看它是否解决了 IIS 中的问题 var result = new JsonResult(new { message = message,incidentId =incidentId });结果.StatusCode = 500; context.Result = 结果;
  • 这确实解决了问题!谢谢!谜团依然存在,但问题已解决。
  • 您可以尝试一件事吗...在我建议的更改之前,您可以尝试明确设置 Content-Length 属性,看看是否可以解决 IIS 上的问题
  • 手动设置长度也修复了它。 context.HttpContext.Request.ContentLength = bytes.Length;
  • 感谢您试用。不知道为什么没有内容长度 IIS 不喜欢它

标签: asp.net-core asp.net-core-mvc


【解决方案1】:

正如 Kiran 上面提到的,我没有设置内容长度。这解决了问题。现在这两种解决方案都可以在 IIS 上正常运行:

string msg = Newtonsoft.Json.JsonConvert.SerializeObject(new { message = message, incidentId = incidentId });
byte[] bytes = Encoding.UTF8.GetBytes(msg);

context.HttpContext.Response.StatusCode = StatusCodes.Status500InternalServerError;
context.HttpContext.Request.ContentLength = bytes.Length;
await context.HttpContext.Response.Body.WriteAsync(bytes, 0, bytes.Length);

var result = new JsonResult(new { message = message, incidentId = incidentId });
result.StatusCode = StatusCodes.Status500InternalServerError;
context.Result = result;

哪个更干净!

【讨论】:

    猜你喜欢
    • 2017-12-15
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 2020-01-21
    • 1970-01-01
    相关资源
    最近更新 更多