有些同事和我遇到问题,即来自ajax调用的响应返回一些意外的内容。 result.responseText的值不是使用各种属性返回简单的JSON对象,而是通用的406状态错误页面的HTML标记,表示浏览器不接受MIME类型。406返回JSON对象时出错 - 意外的内容
电话可以拨出像这样:
$.ajax({
url: '/promociones/cincogratis/canjear-codigo-promocional',
type: this.method,
data: $(this).serialize(),
success: function (result) {
$('.promotion_banner .loader').hide();
$('.promotion_banner').html(result);
},
error: function (result) {
var obj = result.responseText;
if (obj.isRedirect) {
document.location = obj.redirectUrl;
}
else {
$('.promotion_banner .loader').hide();
$(".error-wrapper").removeClass("hidden");
var generic_error = document.getElementById('generic_error').value;
$(".error-wrapper p").html(generic_error);
}
},
beforeSend: function() {
$('.promotion_banner .loader').show();
}
});
控制器响应政府号召是像这样:
Response.StatusCode = (int)HttpStatusCode.NotAcceptable; // 406
return Json(new { errorMessage = LocalErrorMessages.Website_Promotions_FreeFiver_General_Problem, isRedirect = false });
我们希望result.responseText以包含的errorMessage和isRedirect键值,但他们不在那里。
值得指出的是,这段代码是多租户的,由当前应用程序共享,另一个则完全正常。
我们已经尝试过:
- 配置IIS显示详细的错误响应而不是自定义页面以获取更多详细信息 - 为解决问题提供了额外的帮助。
- 允许所有响应的内容类型的号召
- 改变我们网站的文化(这是目前ES-ES)
- 各种web.config中调整
有没有人有这个问题?
如果服务器不支持客户端发送的各种“Accept”头,则应使用“406”。这是你的错误反应的真正含义吗?我不认为HTTP错误是正确的方法;也许你应该返回一个'200',并且客户端会检查响应以确定它是否是错误的(或者可能有更正确的状态码)。 – Jacob 2013-05-01 18:58:03
根据这个答案,'403'可能是一个更好的选择,也许它会保存你的JSON:http://stackoverflow.com/a/3290369/119549 – Jacob 2013-05-01 19:03:32
感谢Jacob。 HTTP是一种应用程序级别的协议,因此我们使用4xx作为告诉浏览器存在业务错误的方式。不寻常的是,服务器返回的406响应是核心代码库的一部分(我们的每个应用程序在这里都使用相同的代码),并且我们仅遇到其中一个应用程序的这个问题。 – 2013-05-02 09:39:48