为什么Internet Explorer不能在发生故障后在Ajax调用中发送HTTP POST主体?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (43)

我们能够可靠地重新创建以下场景:

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

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

我们知道IE(不像大多数其他浏览器)总是发送一个HTTP POST作为两个TCP / IP数据包。标题和正文分开发送。在发生故障后,IE只发送头文件

所以我的问题是 - 为什么这样做?它基于HTTP规范似乎是错误的,其他浏览器不这样做。它只是一个错误?这确实会在任何严重的基于AJAX的Web应用程序中造成混乱。

参考信息:

有一个类似的问题,由HTTP保持活动超时时间短于1分钟引起,这里记录:

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

以下是故障前后的数据包捕获:

注意如何发送HTTP头和有效载荷 http://img827.imageshack.us/i/beforee.png/

发生故障后,请注意如何发送Header。IE 永远不会发送有效负载,并且服务器最终响应超时。 http://img203.imageshack.us/i/retryt.png/

提问于
用户回答回答于

对这个问题似乎没有明确的答案,所以我会提供我的经验数据作为替代,并提供一些方法来解决这个问题。也许一些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测试版重现。
用户回答回答于

Microsoft 使用Microsoft Internet Explorer或其他程序执行重新POST操作时,只发布标头数据的Microsoft知识库文章似乎可以解决此问题。

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

所属标签

可能回答问题的人

  • 优惠活动秘书

    0 粉丝2 提问7 回答
  • 天使的炫翼

    17 粉丝531 提问6 回答
  • 最爱开车啦

    8 粉丝503 提问6 回答
  • uncle_light

    5 粉丝518 提问5 回答

扫码关注云+社区

领取腾讯云代金券