javascript - JQuery Ajax post 参数有时不会在 IE 上发送

标签 javascript ajax internet-explorer jquery

我遇到的问题是,当我使用 jquery ajax post 时,频率非常低(< 2%),post 参数永远不会到达服务器。我确实在访问日志中看到了发布请求。它似乎只发生在 IE 上(我在日志中观察到它在 7、8 和 9 上)。

当我将调用从“post”类型切换为“get”类型时,问题就消失了。

还有其他人在 IE 上见过这种奇怪的行为吗?谢谢!

我已经在各种 ajax 调用中看到过这种情况,但这是一个典型的调用:

var data= {
    "guess" : "m1",
    "eas" : "hello world"
};

$.ajax({
    url: "http://myco.com/ajaxcall.action",
    data: data,
    type : 'post',
    dataType: 'json',
    success: function(data) {},
    error: function() {}
});

更新:传递“cache: false”并不能解决问题。

最佳答案

上周我在自己的应用程序(使用 Dojo,而不是 JQuery)中追踪了类似的问题。从您的描述和发生频率来看,我认为这是同一个问题。

当浏览器和服务器之间使用 HTTP 持久连接(默认行为)时,服务器可以随时关闭 HTTP 连接。当浏览器在服务器关闭连接的同时开始发送新请求时,这会产生一个非常小的计时漏洞。大多数浏览器将使用不同的连接或打开新连接并重新发送请求。这是 RFC 2616 第 8.1.4 节中建议的行为:

<小时/>

客户端、服务器或代理可以随时关闭传输连接 时间。例如,客户端可能已开始发送新请求 同时服务器决定关闭“空闲” 联系。从服务器的 Angular 来看,连接正在建立 空闲时关闭,但从客户的 Angular 来看, 请求正在进行中。

这意味着客户端、服务器和代理必须能够恢复 来自异步关闭事件。客户端软件应该重新打开 传输连接并重新传输中止的请求序列 无需用户交互,只要请求序列是 幂等(参见第 9.1.2 节)。

<小时/>

当发生这种情况时,Internet Explorer 确实会尝试重新发送请求,但是当它碰巧是 POST 时,它会通过发送 header (带有 Content-长度)但没有实际数据。这是一个格式错误的请求,应该总是导致 HTTP 错误(通常是在等待永远不会到来的数据超时之后)。

Microsoft 将此错误记录为 KB 895954(请参阅 http://support.microsoft.com/kb/895954)。微软首先在 IE 6 中发现了这个错误。他们提供了一个修补程序,并且似乎从那时起,每个版本的 IE 都附带了该修补程序,包括 IE 9。该修补程序存在两个问题:

  1. 默认情况下不激活该修补程序。您必须使用 regedit 创建一个非常奇怪的 key 才能激活修复程序:HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_SKIP_POST_RETRY_ON_INTERNETWRITEFILE_KB895954。

  2. 修复并不能真正解决问题。 “固定”行为是,当尝试发送请求时连接关闭时,它甚至不会尝试重新发送它。它只是将错误传递给 JavaScript 应用程序。

看来您必须在代码中添加错误处理程序,并在失败时自行重新发布请求。我正在为我的应用程序寻找这个解决方案。我担心的是,我不确定如何判断我收到的错误是否是由于尝试发送查询失败引起的,或者是由于查询而从服务器发回的某些错误引起的(在这种情况下,我不知道)想要重新发送)。

我编写了一个 C 程序来模拟 Web 服务器并显式关闭连接以查看浏览器如何处理它。我发现 IE 100% 会重现错误行为,而 Firefox、Safari 和 Chrome 则可以 100% 通过在另一个连接上正确重新发送 POST 来恢复。也许答案是“不要使用 IE。”

关于javascript - JQuery Ajax post 参数有时不会在 IE 上发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6941898/

相关文章:

javascript - 从 HTTPS 页面强制 AJAX 调用为 HTTPS

javascript - IE 11 企业模式下未触发本地存储事件

javascript - console.log() 时获取 NaN

javascript - 如何通过JavaScript中的reg表达式检查输入的数字是4位还是7位,然后相应地执行函数hexToRGB?

javascript - 如何使用纯 JavaScript(无 Node)下载 S3 对象数据

c# - 当设置为 ModalPopupExtender TargetControlID 时,后面的链接 OnClick 代码不执行

javascript - TinyMCE 不启动 ajax 加载的文本区域

javascript - 运行 javascript 函数后无法识别 Css 格式

javascript findIndex 与 IE 的问题

asp.net - 使用SignalR和传输模式长轮询时,Asp.net session 永不过期