背景
我使用支持长轮询的类似 Tornado 的服务器。用户访问的每个新网页都会对服务器进行长轮询,如下所示:

$.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 页已加载并发出长轮询请求,现在在服务器端空闲。
  • 我单击第 2 页的链接,该页面已加载并设置了长轮询请求,但第 1 页的长轮询请求仍在服务器端空闲(根据 Fiddler)。

  • 这意味着我将在页面周围单击时堆叠所有长轮询调用,从而最终在服务器上有大量事件连接(或者它们可能共享连接?)

    我的想法
    - 因为它是一个类似 Tornado 的服务器(使用 epoll),所以它可以处理相当多的连接。但在我看来,这个事实并不是要利用。我的意思是我不想在这种情况下在服务器上超时(如果客户端消失了)。
    - 我知道那些独立页面更好地使用了一个通用的 head 并且只通过 ajax 调用交换内容但是我们今天使用的这个设计不是我的调用......
    - 解决此问题的最佳方法可能是重用连接(我认为很难实现)或在浏览器离开页面后立即关闭(您单击另一个页面)。

    谢谢
    -- MyGGaN

    最佳答案

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

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

    关于ajax - 关闭长轮询连接,jQuery-ajax,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1522433/

    10-13 02:02