调用同步xmlhttprequest时IE挂起5分钟

8 javascript ajax internet-explorer

我有一个Web应用程序并使用ajax回调我的网络服务器来获取数据.

有时(在相当不可预测的时刻,但它可以被复制)IE完全挂起5分钟(窗口显示Not Responding)然后返回并且xmlhttprequest对象响应错误12002.

我可以重现它的方式如下.

  1. 使用按钮从主窗口(A)打开窗口(B)
  2. 单击按钮打开窗口B时,窗口A调用同步ajax(PROC1).PROC1运行文件.
  3. 新窗口(B)具有ajax代码(PROC2)并调用服务器异步.运行很好
  4. 用户在PROC2完成之后但在返回数据之前关闭窗口B.
  5. 在主窗口中(a)用户再次单击按钮.PROC1再次运行,但现在send()调用阻塞了5分钟.

请帮忙.我一直在寻找3天.

请注意:*我无法在firefox中测试它(该应用程序不兼容Firefox)*我必须使用同步调用(这就是构建应用程序的方式,并且需要花费太多的开发人员来重写它)

为什么会发生这种情况以及如何解决这个问题?

Dav*_*art 7

你是对的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();
  }
}
Run Code Online (Sandbox Code Playgroud)

另一个选择是使用同步AJAX调用,它将阻塞直到调用返回,基本上锁定浏览器.鉴于您的具体情况,这可能是也可能是不可接受的.

// the 3rd param is whether the call is asynchronous
xhr.open( 'get', 'url', false );
Run Code Online (Sandbox Code Playgroud)

最后,如其他地方所述,您可以调整IE在注册表中使用的最大连接数.期待访问您网站的访问者然而这样做是不现实的,并且它实际上不会解决问题 - 只是推迟它发生.作为旁注,IE8将允许6个并发连接.


Mar*_*man 1

根据msdn, Winsock错误12002的含义如下

ERROR_INTERNET_TIMEOUT

12002

The request has timed out.
Run Code Online (Sandbox Code Playgroud)

Winsock 是 IE 中 XMLHTTP 的底层套接字传输对象,因此任何不在 HTTP 错误范围(300,400,500 等)内的错误几乎总是 winsock 错误。

您的问题不清楚的是第二次是否查询相同的资源。您可以通过附加以下内容来强制使用新的未缓存资源:

'?uid=+'Math.random()
Run Code Online (Sandbox Code Playgroud)

到可能解决问题的 URL。

另一种解决方案可能是将一个函数附加到窗口对象上的“onbeforeunload”事件,以便在窗口 B 关闭之前调用 abort() 任何活动的 XMLHTTP 请求。

希望这两个指针可以解决您的错误。