我有以下示例代码,它可以在我的本地开发环境中运行,但是当发布到使用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”行。
答案 0 :(得分:5)
在您设置Response.StatusCode
后立即添加以下代码:
Response.TrySkipIisCustomErrors = true;
这告诉IIS不要拦截请求并使用自己的错误页面。