ajax - ajaxError 函数不返回 XmlHttpRequest.responseJSON

标签 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);
    }
});

问题是,在配置为 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/

相关文章:

javascript - PHP在不访问网站的情况下执行网站代码

javascript - 在 Javascript 中访问嵌套在另一个对象中的对象的属性

C# ASP.NET MVC PayPal 找不到程序集

c# - MVC Javascript 根据模型设置文本输入值

php - 即使返回错误,ajax 也始终运行成功

javascript - 使用curl进行ajax查询

jquery - 动态更改 jQuery UI 对话框按钮文本

javascript - 如何在不刷新页面的情况下每分钟自动更新股票价格?

php - 如何使用 jquery 调用 php Controller 方法?

asp.net - 如何在没有布局页面的情况下将部分脚本添加到asp.net mvc Razor View