我们能够可靠地重新创建以下情况:
网络连接失败后,IE将发出下一个AJAX请求,但在执行HTTP发布时仅发送 HTTP标头 (而不是正文)。由于这只是部分请求,因此会在服务器上引起各种问题。Google与Bing有关的这个问题,您会发现很多人抱怨使用AJAX或“无法解释的AJAX故障”导致的“服务器随机错误”。
我们知道IE(与大多数其他浏览器不同)总是将HTTP POST作为两个TCP / IP数据包发送。标头和正文分别发送。在发生故障后, IE仅 直接 发送header 。IE从不发送有效负载,服务器最终以超时响应。
所以我的问题是- 为什么它会这样表现?基于HTTP规范,这似乎是错误的,其他浏览器却没有这种行为。这仅仅是一个错误吗?当然,这会在任何基于AJAX的严重Web应用程序中造成严重破坏。
参考信息:
还有一个类似的问题,是由少于1分钟的HTTP保持活动超时触发的,记录在这里:
http://us.generation-nt.com/xmlhttprequest-post-sometimes-fails-when-server- using-keep-aliv-help-188813541.html
http://support.microsoft.com/default.aspx?kbid=831167
这个问题似乎没有明确的答案,因此我将提供经验数据作为替代,并提供一些解决方法。也许某些MS内部人士有一天会对此有所了解…
如果在服务器上 禁用 了HTTP Keep-Alive ,则此问题将消失。换句话说,您的HTTP 1.1服务器将响应每个Ajax请求,Connection: Close并在响应中添加一行。这使IE保持快乐,但会导致每个Ajax请求打开一个新连接。这可能会对性能产生重大影响,尤其是在高延迟网络上。
Connection: Close
如果快速连续提出Ajax请求,则很容易触发该问题。例如,我们每100ms发出一次Ajax请求,然后网络状态发生变化,该错误很容易重现。尽管大多数应用程序可能不会发出此类请求,但您可能会接连发生几次服务器调用,这可能导致此问题。较少的聊天使IE保持快乐。
即使没有NTLM身份验证,它也会发生。
当服务器上的HTTP保持活动超时时间短于默认值(在Windows上默认为60秒)时,就会发生这种情况。相关链接中提供的详细信息。
Chrome或Firefox不会发生这种情况。FF发送一个数据包,因此似乎完全避免了这个问题。
它发生在IE 6、7、8中。无法在IE 9 beta中复制。