закрыть долгое соединение с опросом, jQuery-ajax - PullRequest
3 голосов
/ 06 октября 2009

Фон
Я использую 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. Страница 1 загружена, и сделан запрос на длительный опрос, теперь он находится в режиме ожидания на стороне сервера.
  2. Я нажимаю ссылку на страницу 2, и эта страница загружается и настраивает длинный запрос опроса, НО длинный запрос опроса со страницы 1 все еще не работает на стороне сервера (согласно Fiddler).

Это означает, что я буду складывать все длительные вызовы опроса при щелчке по странице, поэтому у меня будет много активных соединений на сервере (или они могут делиться соединением?)

Мои мысли
- Так как это сервер типа Tornado (использующий epoll), он может обрабатывать довольно много соединений. Но этот факт не использовать на мой взгляд. Я имею в виду, что для этого случая я предпочитаю не использовать тайм-аут на сервере (если клиент исчезает).
- Я знаю, что эти автономные страницы лучше используют общий заголовок и меняют контент только через ajax-вызовы, но этот дизайн, который мы используем сегодня, не был моим вызовом ...
- Лучший способ решить эту проблему, вероятно, состоит в том, чтобы повторно использовать соединение (думаю, его трудно установить) или закрыть, как только браузер покинет страницу (вы переходите на другую страницу).

Спасибо
- MyGGaN

1 Ответ

4 голосов
/ 06 октября 2009

Для соединений с длинным опросом необходимо убедиться, что в Fiddler установлена ​​опция «Потоковая передача». В противном случае Fiddler будет держать соединение открытым, ожидая ответа до конца.

Обычно при переходе от страницы к странице клиент должен разорвать открытое соединение с длинным опросом, фактически закрыв соединение. Я говорю должно , потому что это не всегда работает должным образом, например, когда вы закрываете всплывающее окно в IE.

...