Dod*_*bit 113 javascript ajax internet-explorer
我们能够可靠地重新创建以下场景:
在网络连接失败后,IE会发出下一个AJAX请求,但在执行HTTP发布时只发送HTTP标头(而不是正文).这会导致服务器上出现各种问题,因为它只是部分请求.谷歌与Bing的这个问题,你会发现很多人抱怨使用AJAX或无法解释的AJAX失败的"随机服务器错误".
我们知道IE(与大多数其他浏览器不同)总是将HTTP POST作为TWO TCP/IP数据包发送.标题和正文是分开发送的.在故障发生后的情况下,IE仅发送标头.
所以我的问题是 - 它为什么会这样?基于HTTP规范似乎是错误的,其他浏览器不会这样做.这只是一个错误吗?当然,这会在任何严肃的基于AJAX的Web应用程序中造成严重破坏.
参考信息:
由HTTP保持活动超时触发的类似问题短于1分钟,并在此处记录:
http://support.microsoft.com/default.aspx?kbid=831167
以下是故障包捕获之前和之后:
请注意如何发送HTTP标头和Payload http://img827.imageshack.us/i/beforee.png/
失败后,请注意如何仅发送标头.IE 从不发送有效负载,服务器最终会以超时响应. http://img203.imageshack.us/i/retryt.png/
Dod*_*bit 27
这个问题似乎没有明确的答案,因此我将提供我的经验数据作为替代,并提供一些解决方法.也许有些MS内幕人士有一天会对此有所了解......
如果在服务器上禁用了HTTP Keep-Alive ,则此问题就会消失.换句话说,您的HTTP 1.1服务器将在响应中使用Connection: Close一行响应每个Ajax请求.这使IE保持高兴,但会导致每个Ajax请求打开一个新连接.这会对性能产生重大影响,尤其是在高延迟网络上.
如果快速连续地发出Ajax请求,则很容易触发该问题.例如,我们每100毫秒发出一次Ajax请求,然后网络状态发生变化,错误很容易重现.虽然大多数应用程序可能不会发出此类请求,但您可能会在一个接一个的服务器调用之后发生,这可能会导致此问题.不那么健谈让IE很开心.
即使没有NTLM身份验证,它也会发生.
当服务器上的HTTP保持活动超时短于默认值(在Windows上默认为60秒)时,就会发生这种情况.相关链接中提供的详细信息.
Chrome或Firefox不会发生这种情况.FF发送一个数据包,所以似乎完全避免了这个问题.
它发生在IE 6,7,8中.无法用IE 9 beta重现.
Jul*_*ian 11
微软知识库文章,题为当您使用Microsoft Internet Explorer或其他程序执行重POST操作时,仅头数据公布似乎解决了这个问题.
本文提供了一个修补程序.对于IE8等后来的浏览器,它说已经包含了修补程序,但需要通过客户端PC上的注册表设置启用.