我正在尝试在我的应用程序中全局处理所有 ajax 异常。
我有一个简单的验证异常,在 ajax post 请求发送到服务器后抛出。
if (string.IsNullOrEmpty(name)) { throw new Exception("Name cannot be empty."); }
我有一个类重写 OnException 方法:
public override void OnException(ExceptionContext filterContext)
{
if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
{
return;
}
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;
filterContext.Result = new JsonResult
{
Data = new { message = filterContext.Exception.Message },
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
}
else
{
base.OnException(filterContext);
}
}
还有一个监听所有ajax错误的javascript函数:
$(document).ajaxError(function(e, xhr, settings, exception) {
e.stopPropagation();
if (xhr.responseJSON != null) {
showMessage(xhr.responseJSON.message, ERROR);
}
});
问题是,在配置为 https 的 Azure 服务器上,xhr.responseJSON 未返回。但是,它在本地运行良好,并且我能够显示抛出的异常消息。 https 是否以某种方式阻止了请求?我尝试在本地通过 https 运行我的应用程序,但无法重现该问题。
我打算将相同的方法用于不仅仅是验证异常,因为我知道它们可以很容易地从客户端处理。
最佳答案
我也遇到了同样的问题。
添加 filterContext.HttpContext.Response.TrySkipIisCustomErrors = true
为我解决了这个问题。
所以在你的情况下:
public override void OnException(ExceptionContext filterContext)
{
if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
{
return;
}
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;
filterContext.Result = new JsonResult
{
Data = new { message = filterContext.Exception.Message },
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
// Added this line
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true
}
else
{
base.OnException(filterContext);
}
}
关于ajax - ajaxError 函数不返回 XmlHttpRequest.responseJSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31821673/