小编典典

失败后,为什么Internet Explorer在Ajax调用上不发送HTTP正文?

ajax

我们能够可靠地重新创建以下情况:

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

网络连接失败后,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


阅读 225

收藏
2020-07-26

共1个答案

小编典典

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

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

  2. 如果快速连续提出Ajax请求,则很容易触发该问题。例如,我们每100ms发出一次Ajax请求,然后网络状态发生变化,该错误很容易重现。尽管大多数应用程序可能不会发出此类请求,但您可能会接连发生几次服务器调用,这可能导致此问题。较少的聊天使IE保持快乐。

  3. 即使没有NTLM身份验证,它也会发生。

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

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

  6. 它发生在IE 6、7、8中。无法在IE 9 beta中复制。

2020-07-26