Подтвердить что ты не робот

Chrome останавливается при выполнении нескольких запросов на один ресурс?

Я пытаюсь реализовать длинный опрос в первый раз, и для этого я использую объекты XMLHttpRequest. До сих пор я добился успеха в создании событий в Firefox и Internet Explorer 11, но на этот раз Chrome странно является нечетным.

Я могу загрузить одну страницу, и она работает нормально. Он делает запрос сразу и начинает обработку и отображение событий. Если я открою страницу на второй вкладке, одна из страниц начнет видеть задержки при получении событий. В окне инструментов dev я вижу несколько запросов с таким типом времени:

screenshot

"Замедленный" будет находиться в диапазоне до 20 секунд. Это не будет происходить по каждому запросу, но обычно это происходит по нескольким запросам в строке и на одной вкладке.

Сначала я подумал, что это проблема с моим сервером, но затем я открыл две вкладки IE и две вкладки Firefox, и все они соединяются и получают одни и те же события без остановки. Только Chrome имеет такие проблемы.

Я полагаю, что это, вероятно, проблема с тем, как я делаю или обслуживаю запрос. Для справки заголовки запроса выглядят следующим образом:

Connection: keep-alive
Last-Event-Id: 530
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36
Accept: */*
DNT: 1
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8

Ответ выглядит следующим образом:

HTTP/1.1 200 OK
Cache-Control: no-cache
Transfer-Encoding: chunked
Content-Type: text/event-stream
Expires: Tue, 16 Dec 2014 21:00:40 GMT
Server: Microsoft-HTTPAPI/2.0
Date: Tue, 16 Dec 2014 21:00:40 GMT
Connection: close

Несмотря на вовлеченные заголовки, я не использую собственный EventSource для браузера, а скорее polyfill, который позволяет мне устанавливать дополнительные заголовки. polyfill использует XMLHttpRequest под обложками, но мне кажется, что независимо от того, как выполняется запрос, он не должен останавливаться на 20 секунд.

Что может привести к тому, что Chrome остановится?

Изменить: Страница Chrome chrome://net-internals/# events показывает, что там была ошибка таймаута:

t=33627 [st=    5]      HTTP_CACHE_ADD_TO_ENTRY  [dt=20001]
                --> net_error = -409 (ERR_CACHE_LOCK_TIMEOUT)

Сообщение об ошибке относится к патчу, добавленному в Chrome шесть месяцев назад (https://codereview.chromium.org/345643003), который реализует 20-секундный тайм-аут, когда тот же ресурс запрашивается несколько раз. На самом деле одна из ошибок, исправленных исправлением (номер ошибки 46104) относится к аналогичной ситуации, и патч предназначен для уменьшения время ожидания.

Возможно, ответ (или обходной путь) заключается в том, чтобы сделать запросы похожими, хотя, возможно, Chrome может уважать заголовок "no-cache", который я устанавливаю.

4b9b3361

Ответ 1

Да, это поведение связано с тем, что Chrome блокирует кеш и ждет, чтобы увидеть результат одного запроса, прежде чем снова запрашивать тот же ресурс. Ответ заключается в том, чтобы найти способ сделать запросы уникальными. Я добавил случайное число в строку запроса, и теперь все работает.

Для справок в будущем это был Chrome 39.0.2171.95.

Изменить. С учетом этого ответа я понял, что "Cache-Control: no-cache" не делает то, что я думал. Несмотря на свое имя, ответы с этим заголовком могут быть кэшированы. Я не пробовал, но мне интересно, может ли исправить проблему использование "Cache-Control: no-store", что предотвращает кеширование.

Ответ 2

добавление Cache-Control: no-cache, no-transform работало для меня