我创建了一个新类,它继承自HandleErrorAttribute以不同方式处理ajax请求。唯一的覆盖是OnException方法:
public override void OnException(ExceptionContext filterContext)
{
if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = 500;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
filterContext.Result = new JsonResult { Data = errorText };
return;
}
base.OnException(filterContext);
}
这确实有效,大约一半时间。工作时,响应中的状态代码为500,并提供错误消息。如果没有,状态代码为12031,错误消息为空。
显然,状态代码12031表示:
ERROR_INTERNET_CONNECTION_RESET 与服务器的连接已重置。
不知道为什么会这样。
答案 0 :(得分:0)
我不确定这里到底发生了什么,但我可以做出有根据的猜测。我们做了一些非常相似的事情,除了我们首先调用base.OnException,然后我们测试filterContext.ExceptionHandled以查看基本过滤器是否处理了异常。这一直对我们有用,并且与你的不同。请注意,基本过滤器不会始终处理异常(有关详细信息,请参阅源代码)。
请注意,基本过滤器会执行过滤器不执行的操作,例如测试IsCustomErrorEnabled以及异常的特定类型。有些例外情况不应该处理;再次参考MVC源代码了解详细信息。
所以我的猜测是,在某些情况下,你的过滤器(当有一个AJAX请求时总是处理异常)和基过滤器做不同的事情。我建议您尝试我们正在使用的方法(首先调用base,如果请求是一个AJAX请求,只执行自定义AJAX处理,基础已指示应该处理异常)并且看看这不会最终为你做得更好。