我遇到的问题是,当我以极低的频率(<2%)使用jquery ajax post时,post参数永远不会到达服务器。我确实在访问日志中看到了发帖请求。它似乎仅在IE上发生(我在日志中的7、8和9上已经观察到了)。
当我将呼叫从“发布”类型切换为“获取”类型时,问题就消失了。
有没有人见过这种奇怪的行为在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() {} });
更新 :传递“缓存:假”不能解决此问题。
我花了最后一周在自己的应用程序中查找了类似的问题(使用Dojo,而不是JQuery)。从您的描述和出现的频率来看,我想说的是同样的问题。
当浏览器和服务器之间使用HTTP持久连接时(默认行为),服务器可以随时关闭HTTP连接。当浏览器在服务器关闭连接的同时开始发送新请求时,这会造成一个非常小的计时漏洞。大多数浏览器将使用其他连接或打开新连接并重新发送请求。这是RFC 2616第8.1.4节中建议的行为:
客户端,服务器或代理可以随时关闭传输连接。例如,客户端可能已开始在服务器决定关闭“空闲”连接的同时发送新请求。从服务器的角度来看,连接在空闲时正在关闭,但是从客户端的角度来看,请求正在进行中。
这意味着客户端,服务器和代理必须能够从异步关闭事件中恢复。客户端软件应该重新打开传输连接并重新发送中止的请求序列,而无需用户干预,只要请求序列是幂等的(参见第9.1.2节)。
Internet Explorer 确实会 尝试在发生这种情况时重新发送该请求, 但是 当它恰好是POST时,它将通过发送标头(带有Content- Length)而不发送实际数据来处理它。这是格式错误的请求,应始终导致HTTP错误(通常是在超时之后等待永远不会出现的数据)。
此错误被Microsoft记录为KB 895954(请参阅http://support.microsoft.com/kb/895954)。Microsoft首先在IE 6中发现了此错误。他们提供了一个修复程序,并且此后似乎包括IE 9在内的每个版本的IE都附带了此修复程序。此修复程序有两个问题:
默认情况下未激活此修复程序。您必须使用regedit创建一个真正奇怪的密钥才能激活此修复程序:HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Internet Explorer \ Main \ FeatureControl \ FEATURE_SKIP_POST_RETRY_ON_INTERNETWRITEFILE_KB895954。
该修复程序并不能真正解决问题。“固定”行为是,当尝试发送请求时关闭连接时,它甚至不尝试重新发送请求。它只是将错误传递给javascript应用程序。
看来您必须在代码中添加错误处理程序,如果请求失败,则可以自己重新发布请求。我正在为我的应用程序研究此解决方案。我担心的是,我不确定如何确定我收到的错误是由于发送查询的尝试失败还是由于查询导致的从服务器发送回的某些错误引起的(在这种情况下,我不会想重新发送)。
我编写了一个C程序来模拟Web服务器,并显式关闭连接以查看浏览器如何处理它。我发现IE可以100%地重现错误行为,而Firefox,Safari和Chrome可以通过100%的时间正确地在另一个连接上重新发送POST来恢复。答案可能是“不要使用IE”。