带有json内容类型的jquery ajax帖子以HTML格式返回错误请求

时间:2014-07-01 23:39:29

标签: javascript jquery ajax json asp.net-mvc-4

我有以下示例代码,它可以在我的本地开发环境中运行,但是当发布到使用HTTPS的实时环境并使用.NET捆绑用于javascript和ELMAH用于错误记录时,这不再按预期工作。< / p>

我使用responseText“错误请求”并且没有responseJSON属性来获取HTML内容响应,而不是JSON内容响应,因此此代码会导致javascript错误。

有谁知道为什么内容类型会被更改?可能是因为这是在一个现场环境和响应代码400?但我不确定这里发生了什么。

控制器:

        public JsonResult JsonModelErrorResult()
        {
            Response.StatusCode = 400;
            var errors = ModelState.Values.SelectMany(m => m.Errors);
            return Json(errors);
        }

        [HttpPost]
        public ActionResult GetData()
        {
...
            if (results != null && results.Any())
            {
                return Json(result, JsonRequestBehavior.AllowGet);
            }
            else
            {
                ModelState.AddModelError("SearchResults", "No results found");
                return this.JsonModelErrorResult();
            }
        }

使用Javascript:

$.ajax("/Controller/GetData/", {
                dataType: "json",
                type: "POST",
                contentType: "application/json"
            })
            .done((result) => {
            })
            .fail((xhr) => {
                setTimeout(() => {
                    this.errors(xhr.responseJSON);
                }, 200);
            })
            .always(() => {
            });

更新

当我在Chrome中查看请求的响应时,这是响应标头:

HTTP/1.1 400 Bad Request
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Content-Type: text/html
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNetMvc-Version: 4.0
X-AspNet-Version: 4.0.30319
Persistent-Auth: true
X-Powered-By: ASP.NET
Date: Thu, 03 Jul 2014 12:08:23 GMT
Content-Length: 11

,来自ajax调用的返回值是一个Jquery jqXHR对象,其responseText属性为"Bad Request",内容类型为"text/html"

更新2: 这是我的web.config中的自定义错误设置

<customErrors mode="RemoteOnly" defaultRedirect="~/Error">
  <error statusCode="401" redirect="~/Error/NotAuthorised" />
  <error statusCode="403" redirect="~/Error/NotAuthorised" />
  <error statusCode="404" redirect="~/Error/NotFound" />
</customErrors>

测试时我将模式更改为“关闭”,但这在IIS8的实时环境中不起作用,也许我错过了需要更新的内容才能使IIS正确执行此操作或{{1}应该也被删除? 但添加线 defaultRedirect="~/Error"> 进入JsonModelErrorResult代码已停止此内容/ html错误,返回“Bad Request”行。

1 个答案:

答案 0 :(得分:5)

在您设置Response.StatusCode后立即添加以下代码:

Response.TrySkipIisCustomErrors = true;

这告诉IIS不要拦截请求并使用自己的错误页面。