我有一个基于jQuery构建的相当简单的ajax调用。它在IE9,Firefox最新版本和Chrome最新版本中完美运行(所以我很确定AJAX调用发布的页面很好)但是在IE8上(未尝试IE7)它失败了。
jQuery代码是:
$('.to-step-2').click(function(){
var d = new Date();
var roomShape;
blnError = false;
$.ajax({
url: '/base/RoomBuilder/GetRoomShape.aspx?_='+d.getTime(),
async: false,
type: 'post',
cache: false,
dataType: 'html',
success: function(data){
if(data.substring(0,5) == 'Error'){
alert('Please select a room shape to continue');
blnError = true;
}else{
roomShape = data;
}
},
error: function(jqXHR, textStatus, errorThrown){
alert('Error 6: jqXHR = ' + jqXHR + '\ntextStatus = ' + textStatus + '\nerrorThrown = ' + errorThrown);
blnError = true;
}
});
if (blnError == true){
return false;
}
仅在IE8中抛出的错误是:
Error 6: jqXHR = [object Object]
textStatus = error
errorThrown = Length Required
我已经看过其他一些关于类似事情的帖子,但添加时间戳和缓存:false以防止缓存似乎是非常常见的解决方案,但仍然不适合我:(
任何人都可以看到为什么会发生这种情况并建议修复吗?
答案 0 :(得分:3)
您从服务中获得411 response:
411长度
服务器拒绝接受没有定义Content-Length的请求。如果客户端在请求消息中添加包含消息正文长度的有效Content-Length头字段,则客户端可以重复该请求。
这是因为如果没有数据,jQuery在发布时不会设置内容长度标题。发布到IIS时这是一个安全要求:
基本问题是,即使没有内容(POST数据),IIS6 +的大多数安装都要求为所有POST请求提供内容长度。
没有数据的请求的内容长度应为0,但除非有数据参数,否则jQuery不会自动设置该标头。由于ASP.NET AJAX的JSON序列化服务需要POST请求,因此这成为了只读请求的绊脚石。
(引自http://encosia.com/3-mistakes-to-avoid-when-using-jquery-with-aspnet-ajax/)
简单地将数据参数设置为空对象似乎是最简单的解决方法:
$.ajax({
url: '/base/RoomBuilder/GetRoomShape.aspx?_='+d.getTime(),
async: false,
type: 'post',
cache: false,
data: "{}",
dataType: 'html',
success: function(data){
if(data.substring(0,5) == 'Error'){
alert('Please select a room shape to continue');
blnError = true;
}else{
roomShape = data;
}
}
答案 1 :(得分:3)
根据错误: errorThrown =需要长度,尝试添加虚拟数据,例如:
$.ajax({
url: '/base/RoomBuilder/GetRoomShape.aspx?_='+d.getTime(),
async: false,
type: 'post',
cache: false,
dataType: 'html',
data: {},
.....
希望它有效