Мы можем достоверно воссоздать следующий сценарий:
- Создайте небольшую HTML-страницу, которая делает запросы AJAX к серверу (используя HTTP POST)
- Отключитесь от сети и снова подключитесь
- Отслеживайте пакеты, которые IE генерирует после сбоя
После сбоя сетевого подключения IE выполняет следующий запрос AJAX, но при отправке HTTP-сообщения отправляет только заголовок HTTP (а не тело). Это вызывает всевозможные проблемы на сервере, поскольку это только частичный запрос. Погуглите эту проблему с Bing, и вы найдете множество людей, жалующихся на «случайные ошибки сервера» с использованием AJAX или необъяснимые сбои AJAX.
Мы знаем, что IE (в отличие от большинства других браузеров) всегда отправляет HTTP POST в виде ДВУХ пакетов TCP / IP. Заголовок и тело отправляются отдельно. В случае, если сразу после сбоя IE отправляет только заголовок . IE никогда не отправляет полезную нагрузку, и сервер в конечном итоге отвечает тайм-аутом.
Итак, у меня вопрос - почему он так себя ведет? Это кажется неправильным, исходя из спецификации HTTP, и другие браузеры так себя не ведут. Это просто ошибка? Несомненно, это разрушит любое серьезное веб-приложение на основе AJAX.
Справочная информация:
Существует аналогичная проблема, вызванная тайм-аутом HTTP keep-alive, который короче 1 минуты, и документирована здесь:
источник
Ответы:
На этот вопрос, похоже, нет однозначного ответа, поэтому я предоставлю свои эмпирические данные в качестве замены и предложу несколько способов обойти это. Может быть, какой-нибудь инсайдер MS однажды прольет свет на это ...
Если HTTP Keep-Alive отключен на сервере, эта проблема исчезнет. Другими словами, ваш сервер HTTP 1.1 будет отвечать на каждый запрос Ajax
Connection: Close
строкой в ответе. Это делает IE счастливым, но заставляет каждый запрос Ajax открывать новое соединение. Это может существенно повлиять на производительность, особенно в сетях с высокой задержкой.Проблема возникает легко, если запросы Ajax выполняются в быстрой последовательности. Например, мы делаем запросы Ajax каждые 100 мс, а затем состояние сети меняется, ошибку легко воспроизвести. Хотя большинство приложений, вероятно, не отправляют такие запросы, у вас вполне может быть несколько вызовов сервера, происходящих сразу друг за другом, что может привести к этой проблеме. Меньше болтливости делает IE счастливым.
Это происходит даже без аутентификации NTLM.
Это происходит, когда время ожидания проверки активности HTTP на сервере короче, чем значение по умолчанию (которое по умолчанию составляет 60 секунд в Windows). Подробности указаны в соответствующей ссылке.
Этого не происходит с Chrome или Firefox. FF отправляет один пакет, поэтому, похоже, полностью избегает этой проблемы.
Это происходит в IE 6, 7, 8. Невозможно воспроизвести с IE 9 beta.
источник
Статья базы знаний Майкрософт под названием « Когда вы используете Microsoft Internet Explorer или другую программу для выполнения операции повторной POST, только данные заголовка публикуются , чтобы решить эту проблему.
В статье содержится исправление. Для более поздних браузеров, таких как IE8, говорится, что исправление уже включено, но его необходимо включить в настройках реестра на клиентском ПК.
источник
У меня была аналогичная проблема, когда некоторые старые версии IE отправляли обратно только заголовок, а не тело POST. Моя проблема оказалась связана с IE и NTLM. Поскольку вы не упомянули NTLM, это, вероятно, не поможет, но на всякий случай:
http://support.microsoft.com/kb/251404
источник
Это длинный снимок, но IE (и даже Firefox) иногда «запоминает» соединение, которое он использует для HTTP-запроса. Примечания / примеры:
В Firefox, если я изменю настройки прокси-сервера и нажму SHIFT-RELOAD на странице, он все равно будет использовать старый прокси. Однако, если я убью старый прокси («killall squid»), он начнет использовать новый прокси.
При отключении / повторном подключении вы получаете новый IP-адрес или что-то подобное? Можете ли вы каким-то образом отслеживать старый IP-адрес, чтобы узнать, отправляет ли IE данные на этот теперь мертвый адрес?
Я предполагаю, что IE отправляет данные по неправильному пути. Он может быть достаточно умен, чтобы не кэшировать сетевые соединения для пакетов POST, но может быть недостаточно умен, чтобы делать это для полезных данных POST.
Это, вероятно, не влияет на большинство приложений AJAX, поскольку люди редко отключаются и повторно подключаются к своим сетям?
источник
Вы используете аутентификацию NTLM?
При использовании аутентификации NTLM IE не отправляет пост-данные. Он отправляет информацию заголовка, ожидает несанкционированного ответа на отправку авторизации и после повторной аутентификации отправляет сообщение.
источник
Сегодня у меня была аналогичная проблема при использовании $ .ajax, и я смог исправить ее, установив для async значение false.
источник