编写自定义500响应正文与IIS Express一起使用,但在IIS ASP.Net Core 1.0上失败

时间:2016-07-06 20:04:08

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

我正在开发一个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的方法: enter image description here

完美。正是我所期待的。在完整的IIS下,Postman说:“伯爵没有得到任何回应”。 API的其余部分工作正常,并且日志被写入,因此它正在进入过滤器,只是没有任何东西出现....

1 个答案:

答案 0 :(得分: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);

OR

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

哪个更清洁!