Javascript json内容类型为HTML返回错误请求的jquery ajax帖子
我有下面的示例代码,可以在本地开发环境中使用,但当发布到使用HTTPS并使用.NET绑定的javascript和ELMAH进行错误记录的实时环境时,这将不再像预期的那样工作 我得到的不是JSON内容响应,而是一个HTML内容响应,带有Javascript json内容类型为HTML返回错误请求的jquery ajax帖子,javascript,jquery,ajax,json,asp.net-mvc-4,Javascript,Jquery,Ajax,Json,Asp.net Mvc 4,我有下面的示例代码,可以在本地开发环境中使用,但当发布到使用HTTPS并使用.NET绑定的javascript和ELMAH进行错误记录的实时环境时,这将不再像预期的那样工作 我得到的不是JSON内容响应,而是一个HTML内容响应,带有responseText“坏请求”和noresponseJSON属性,因此该代码导致javascript错误 有人知道为什么会更改内容类型吗?大概是因为这是一个活的环境,响应代码是400?但我不确定这里发生了什么 控制器: public JsonRe
responseText
“坏请求”和noresponseJSON
属性,因此该代码导致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:
这是my 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正确执行此操作,或者defaultRedirect=“~/Error”>
也应该被删除?
但是增加了线
Response.tryskipiiscustomerors=true代码>
在JsonModelErrorResult中,代码已停止此内容/html错误,返回了“错误请求”一行。在设置响应后立即执行。StatusCode
添加此代码行:
Response.TrySkipIisCustomErrors = true;
这会告诉IIS不要截获请求并使用其自己的错误页。在设置响应后立即执行。StatusCode
添加这行代码:
Response.TrySkipIisCustomErrors = true;
这会告诉IIS不要截获请求并使用自己的错误页面。考虑到环境,不确定,但您是否尝试过此响应。Headers.Add('Content-type','text/json');Add('Content-type','application/json');可能是您在ASP.NET或IIS级别遇到问题,并且您的代码(至少是服务器端)正常(这可能解释了内容类型的更改)。返回HTTP 400可能有多种原因,例如请求头太长、查询字符串中的特殊字符或HTTP请求的大小太大。我将检查您发出的HTTP请求,并检查服务器上的事件查看器,以查看框架是否为您记录了错误。告诉我你发现了什么,我对这个很好奇。@Pricey我认为强制内容类型走错了路。你检查过事件查看器了吗?在Ajax调用中返回的实际HTML内容是什么?你能给出准确的回答吗?@Pricey试着看这里:C:\Windows\System32\LogFiles\HTTPERR
。您在日志文件中看到与400代码对应的任何内容吗?@Pricey在您设置响应后立即添加这行代码:Response.tryskipiiscustomerors=true
。这告诉IIS不要截获请求并使用自己的错误页面。让我知道结果。不确定,考虑到环境,但您是否尝试过此响应。Headers.Add('Content-type','text/json');Add('Content-type','application/json');可能是您在ASP.NET或IIS级别遇到问题,并且您的代码(至少是服务器端)正常(这可能解释了内容类型的更改)。返回HTTP 400可能有多种原因,例如请求头太长、查询字符串中的特殊字符或HTTP请求的大小太大。我将检查您发出的HTTP请求,并检查服务器上的事件查看器,以查看框架是否为您记录了错误。告诉我你发现了什么,我对这个很好奇。@Pricey我认为强制内容类型走错了路。你检查过事件查看器了吗?在Ajax调用中返回的实际HTML内容是什么?你能给出准确的回答吗?@Pricey试着看这里:C:\Windows\System32\LogFiles\HTTPERR
。您在日志文件中看到与400代码对应的任何内容吗?@Pricey在您设置响应后立即添加这行代码:Response.tryskipiiscustomerors=true
。这告诉IIS不要截获请求并使用自己的错误页面。让我知道结果。