为什么 Internet Explorer 在失败后不发送 HTTP post body on Ajax 调用?

2022-08-30 05:26:20

我们能够可靠地重现以下场景:

  1. 创建一个小的 HTML 页面,该页面向服务器发出 AJAX 请求(使用 HTTP POST)
  2. 断开网络连接并重新连接
  3. 监视 IE 在发生故障后生成的数据包

网络连接失败后,IE 会发出下一个 AJAX 请求,但在执行 HTTP 发布时仅发送 HTTP 标头(而不是正文)。这会导致服务器上出现各种问题,因为它只是部分请求。谷歌这个问题与Bing,你会发现很多人抱怨使用AJAX的“随机服务器错误”或无法解释的AJAX故障。

我们知道IE(与大多数其他浏览器不同)总是将HTTP POST作为两个TCP / IP数据包发送。标头和正文是单独发送的。在失败后直接的情况下,IE 仅发送标头。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


答案 1

这个问题似乎没有一个明确的答案,所以我将提供我的经验数据作为替代品,并提供一些解决它的方法。也许一些MS内部人士有一天会对此有所了解......

  1. 如果在服务器上禁用了 HTTP 保持活动状态,则此问题将消失。换句话说,您的 HTTP 1.1 服务器将响应每个 Ajax 请求,并在响应中加入一行。这让IE感到满意,但会导致每个Ajax请求打开一个新的连接。这可能会对性能产生重大影响,尤其是在高延迟网络上。Connection: Close

  2. 如果快速连续地发出Ajax请求,则很容易触发该问题。例如,我们每100ms发出Ajax请求一次,然后网络状态发生变化,错误很容易重现。尽管大多数应用程序可能不会发出此类请求,但您可能会有几次服务器调用彼此紧接发生,这可能会导致此问题。不那么健谈会让IE开心。

  3. 即使没有NTLM身份验证,也会发生这种情况。

  4. 当服务器上的 HTTP 保持活动超时短于默认值(在 Windows 上默认为 60 秒)时,就会发生这种情况。相关链接中提供的详细信息。

  5. Chrome或Firefox不会发生这种情况。FF发送一个数据包,因此似乎完全避免了此问题。

  6. 它发生在IE 6,7,8中。无法使用 IE 9 测试版进行重现。


答案 2

标题为“当您使用 Microsoft Internet Explorer 或其他程序执行重新开机自检操作时,仅发布标头数据”的 Microsoft 知识库文章似乎可以解决此问题。

本文提供了一个修补程序。对于更高版本的浏览器(如 IE8),它说已包含此修补程序,但需要通过客户端 PC 上的注册表设置启用。