закрыть соединение с длинным опросом, jQuery-ajax

Предыстория
Я использую сервер, похожий на 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


person MyGGaN    schedule 05.10.2009    source источник


Ответы (1)


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

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

person EricLaw    schedule 06.10.2009
comment
Спасибо за ваш вклад! Я попытался включить потоковую передачу в Fiddler, а также попробовал программу под названием Http debug PRO, но они все равно показывают, что соединение открыто. Я посмотрю, смогу ли я иметь счетчик соединений на стороне сервера. - person MyGGaN; 07.10.2009
comment
Вы можете попробовать, чтобы ваше событие OnUnload отсоединило обработчики событий от объекта XMLHTTPRequest. Это может улучшить сборку мусора объекта, что, в свою очередь, может закрыть базовое соединение. - person EricLaw; 08.10.2009
comment
Спасибо, я попробую и сообщу, решило ли это проблему. - person MyGGaN; 09.10.2009
comment
В jQuery у вас может быть функция beforeSend(XMLHttpRequest) для вызовов ajax. Я сохранил эти объекты XHR в массиве, а при выгрузке окна я вызвал .abort() для каждого объекта в массиве. Это действительно немного помогло. Но соединение не закрывал, поэтому у меня еще много соединений открыто. Дальнейшие идеи приветствуются! Спасибо за эти советы EricLaw! - person MyGGaN; 08.11.2009