我有一个Web应用程序并使用ajax回调我的网络服务器来获取数据.
有时(在相当不可预测的时刻,但它可以被复制)IE完全挂起5分钟(窗口显示Not Responding)然后返回并且xmlhttprequest对象响应错误12002.
我可以重现它的方式如下.
使用按钮从主窗口(A)打开窗口(B)
单击按钮打开窗口B时,窗口A调用同步ajax(PROC1).PROC1运行文件.
新窗口(B)具有ajax代码(PROC2)并调用服务器异步.运行很好
用户在PROC2完成之后但在返回数据之前关闭窗口B.
在主窗口中(a)用户再次单击按钮.PROC1再次运行,但现在send()调用阻塞了5分钟.
请帮忙.我一直在寻找3天.
请注意:*我无法在firefox中测试它(该应用程序不兼容Firefox)*我必须使用同步调用(这就是构建应用程序的方式,并且需要花费太多的开发人员来重写它)
为什么会发生这种情况以及如何解决这个问题?
你是对的Jaap,这与Internet Explorer的连接限制为2有关.出于某种原因,IE不会释放与关闭窗口中执行的AJAX请求的连接.
我的情况非常相似,只是稍微简单一些:
用户在窗口A中单击以打开窗口B.
Window B执行需要一段时间的Ajax调用
在Ajax调用返回之前,用户关闭Window B.与此调用的连接"泄漏".
重复1次,直到两个可用连接都"泄露"
浏览器变得没有响应
您可以尝试的一种技术(在您找到的文章中提到)似乎有效,是在页面的卸载事件中中止XmlHttp请求.
所以类似于:
var xhr = null; function unloadPage() { if( xhr !== null ) { xhr.abort(); } }
另一个选择是使用同步AJAX调用,它将阻塞直到调用返回,基本上锁定浏览器.鉴于您的具体情况,这可能是也可能是不可接受的.
// the 3rd param is whether the call is asynchronous xhr.open( 'get', 'url', false );
最后,如其他地方所述,您可以调整IE在注册表中使用的最大连接数.期待访问您网站的访问者然而这样做是不现实的,并且它实际上不会解决问题 - 只是推迟它发生.作为旁注,IE8将允许6个并发连接.