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

问题描述 投票:0回答:5

我遇到的问题是,当我使用 jquery ajax post 时,频率非常低(< 2%), the post parameters never make it to the server. I do see the post request in the access log. It seems to happen only on IE (I've observed it on 7, 8, and 9 in the logs).

当我将呼叫从“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”并不能解决问题。

javascript ajax internet-explorer jquery
5个回答
29
投票

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

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


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

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


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

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

  1. 该修补程序默认未激活。您必须使用 regedit 创建一个非常奇怪的密钥来激活修复: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。”


4
投票

直接回答您的问题:是的,我们刚刚遇到这个问题,但找不到合理的解释。它只影响 IE,而且频率非常低——花了很长时间才得出结论,它是 IE 中的一个零星 jQuery Ajax bug。我们必须通过在这种情况下从服务器返回失败并在 1 秒延迟后重新发布数据来“修复”问题!

哈基,但似乎是唯一的方法。

绝对没有与 DOM 元素等发生冲突,并且没有逻辑原因发生这种情况,用户可以成功多次更新页面,但会出现间歇性失败。

一定是一个错误。


1
投票

我认为你必须阻止 Internet Explorer 中的缓存。尝试将选项缓存设置为 false。

示例:

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

1
投票

发送到 PHP 的参数是从 IE 中接收的

GET
:

$.ajax ({
     url: "path/to/ajax.php"
    ,method: "POST"
    ,data: {
         var1: "value1"
        ,var2: true
        ,varX: 123123
    }
    ,cache: false
    ,success: function (data) {
        alert (data);
    }
});

那么在 PHP 上你应该使用 REQUEST 而不是 POST:

$var1 = $_REQUEST ["var1"]; // value1
$var2 = $_REQUEST ["var2"]; // true
$var3 = $_REQUEST ["var3"]; // 123123

此示例可以使用它来兼容 IE7


0
投票

直到2024年,人们仍然会被这个问题困扰。有些用户很容易触发这个问题,本地很难重现,我们的系统部署在内网环境中,远程调试很麻烦……我怀疑我们系统出现问题的原因与短时间内同一URL同时发出的POST请求数量,以及用户的网络环境和浏览器。 有什么办法可以可靠地重现这个问题吗?

© www.soinside.com 2019 - 2024. All rights reserved.