我们能够可靠地重新创建以下场景:
- 创建一个向服务器发出AJAX请求的小HTML页面(使用HTTP POST)
- 断开与网络的连接,然后重新连接
- 监控IE在故障后生成的数据包
网络连接失败后,IE发出下一个AJAX请求,但在执行HTTP post时只发送HTTP头(而不是正文)。这会在服务器上引起各种各样的问题,因为这只是一个部分请求。用谷歌搜索Bing这个问题,你会发现很多人抱怨使用AJAX的“随机服务器错误”或无法解释的AJAX故障
我们知道IE(与大多数其他浏览器不同)总是将HTTP POST作为两个TCP/IP数据包发送。标题和正文分别发送。在发生故障后,IE只发送标题。IE从不发送有效负载,服务器最终会超时响应
所以我的问题是——为什么它会这样?基于HTTP规范,这似乎是错误的,而其他浏览器则不是这样。这仅仅是一个bug吗?这无疑会对任何基于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
这个问题似乎没有一个明确的答案,所以我将提供我的经验数据作为替代,并提供一些解决方法。也许有一天某位微软内部人士会对此有所了解
-
如果服务器上禁用了HTTP保持活动,则此问题将消失。换句话说,HTTP 1.1服务器将使用响应中的
连接:Close行响应每个Ajax请求。这使IE保持愉快,但会导致每个Ajax请求打开一个新连接。这可能会对性能产生重大影响,尤其是在高延迟网络上 -
如果Ajax请求连续快速发出,则很容易触发此问题。例如,我们每100ms发出一次Ajax请求,然后网络状态发生变化,错误很容易重现。虽然大多数应用程序可能不会发出这样的请求,但您可能会有几个服务器调用紧接着发生,这可能会导致此问题。少说闲话能让我开心
-
即使没有NTLM身份验证,也会发生这种情况
-
当服务器上的HTTP保持活动超时短于默认值(Windows上的默认值为60秒)时,就会发生这种情况。有关链接中提供了详细信息
-
Chrome或Firefox不会出现这种情况。FF发送一个数据包,因此似乎完全避免了这个问题
-
它发生在IE 6、7、8中。无法使用IE 9测试版复制