关闭长轮询连接,jQuery-ajax

时间:2009-10-05 21:15:10

标签: ajax jquery long-polling ajax-polling

背景
我使用类似龙卷风的服务器,支持长轮询。用户来的每个新网页都会向服务器设置一个长轮询,如下所示:

$.ajax({
    type: 'GET',
    url: "/mylongpollurl/",
    dataType: 'application/json',
    success: function(json) {
        // I do stuff here
    },
    error: function(xhr, errText, ex) {
        // If timeout I send a new long-poll request
    }
});

问题
我现在依赖于我从Fiddler监控从浏览器发出的所有请求(目前为FF)的数据。

  1. 加载了第1页并且发出了长轮询请求,现在在服务器端空闲。
  2. 我点击第2页的链接并加载该页面并设置长轮询请求,但是来自第1页的长轮询请求仍在服务器端空闲(根据Fiddler)。
  3. 这意味着我会在点击页面时堆叠所有长轮询调用,从而最终在服务器上有很多活动连接(或者他们可能共享连接?)

    我的想法
      - 因为它是一个类似龙卷风的服务器(使用epoll),它可以处理很多连接。但在我看来,这个事实并没有被利用。我的意思是,我不希望在这种情况下服务器上没有超时(客户端消失了)   - 我知道那些独立的页面更好地使用一个共同的头,只通过ajax调用交换内容,但我们今天使用的这个设计不是我的呼吁...
      - 解决这个问题的最佳方法可能是重新使用连接(我认为很难完成)或者在浏览器离开页面后立即关闭(您点击另一个页面)。

    感谢
    - MyGGaN

1 个答案:

答案 0 :(得分:4)

对于长轮询连接,您需要确保在Fiddler中设置了“Streaming”选项。否则,Fiddler将保持连接打开无限期等待响应完成。

通常,当您从一个页面导航到另一个页面时,客户端应该拆除打开的长轮询连接,从而有效地关闭连接。我说应该,因为这并不总是正常工作,例如,当您关闭IE中的弹出窗口时。