ajaxError函数不返回XmlHttpRequest.responseJSON

时间:2015-08-05 00:48:46

标签: ajax json asp.net-mvc

我试图在我的应用程序中全局处理所有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);
    }
});

问题是,在我的Azure服务器上配置了https, xhr.responseJSON未返回。但是,它在本地工作正常,我能够显示抛出的异常消息。 https以某种方式阻止了请求吗?我已尝试通过https在本地运行我的应用程序,但我无法重新创建该问题。

我打算使用相同的方法,而不仅仅是验证异常,因为我知道它们可以从客户端轻松处理。

1 个答案:

答案 0 :(得分:4)

我有同样的问题。

添加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);
        }
 }