Мы можем надежно воссоздать следующий сценарий:
- Создайте небольшую HTML-страницу, которая делает запросы AJAX на сервере (используя HTTP POST)
- Отключиться от сети и снова подключиться
- Отслеживать пакеты, которые IE генерирует после сбоя
После неудачного сетевого подключения IE делает следующий запрос AJAX, но только отправляет HTTP-заголовок (а не тело) при выполнении HTTP-сообщения. Это вызывает всевозможные проблемы на сервере, поскольку это всего лишь частичный запрос. Google эта проблема с Bing, и вы обнаружите, что многие люди жалуются на "случайные ошибки сервера" с использованием AJAX или необъяснимых сбоев AJAX.
Мы знаем, что IE (в отличие от большинства других браузеров) всегда отправляет HTTP POST в виде двух TCP/IP-пакетов. Заголовок и тело отправляются отдельно. В случае непосредственно после сбоя IE отправляет только заголовок.
Итак, мой вопрос: почему он ведет себя так? Похоже, что это неправильно на основе спецификации HTTP, а другие браузеры не ведут себя так. Это просто ошибка? Несомненно, это создает хаос в любом серьезном веб-приложении на основе AJAX.
Справочная информация:
Существует аналогичная проблема, вызванная таймаутами HTTP keep-alive, которые короче 1 минуты и описаны здесь:
http://support.microsoft.com/default.aspx?kbid=831167
Ниже перечислены пакеты до и после отказа:
Обратите внимание, как отправляется HTTP-заголовок и полезная нагрузка http://img827.imageshack.us/i/beforee.png/
После сбоя обратите внимание, как отправляется только заголовок. IE никогда не отправляет полезную нагрузку, и сервер в конечном итоге отвечает на Timeout. http://img203.imageshack.us/i/retryt.png/