【发布时间】: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