Chrome останавливается при выполнении нескольких запросов к одному и тому же ресурсу?
Я пытаюсь реализовать длинный опрос впервые, и я использую объекты XMLHttpRequest для этого. До сих пор я успешно получал события в Firefox и Internet Explorer 11, но в этот раз странным оказался Chrome.
Я могу загрузить одну страницу, и она работает нормально. Он сразу делает запрос и начинает обрабатывать и отображать события. Если я открою страницу во второй вкладке, на одной из страниц начнутся задержки при получении событий. В окне инструментов разработчика я вижу несколько запросов с такой синхронизацией:
«Задержка» будет длиться до 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, а скорее полифилл, который позволяет мне устанавливать дополнительные заголовки. Полифилл использует XMLHttpRequest под прикрытием, но мне кажется, что независимо от того, как выполняется запрос, он не должен останавливаться в течение 20 секунд.
Что может привести к тому, что 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», который я установил.