Почему Internet Explorer не отправляет тело сообщения HTTP при вызове Ajax после сбоя? - PullRequest
113 голосов
/ 25 января 2011

Мы можем надежно воссоздать следующий сценарий:

  1. Создать небольшую HTML-страницу, которая отправляет запросы AJAX на сервер (используя HTTP POST)
  2. Отключение от сети иПереподключение
  3. Отслеживание пакетов, которые IE генерирует после сбоя

После сбоя сетевого подключения IE делает следующий запрос AJAX, но отправляет только HTTP-заголовок (не тело) при выполнении поста HTTP.Это вызывает все виды проблем на сервере, так как это только частичный запрос.Обсудите эту проблему с Bing, и вы найдете множество людей, жалующихся на «случайные ошибки сервера» при использовании AJAX или необъяснимые сбои AJAX.

Мы знаем, что IE (в отличие от большинства других браузеров) всегда отправляет HTTP POST в виде ДВУХ пакетов TCP / IP.Заголовок и тело отправляются отдельно.В случае сразу после сбоя IE отправляет только заголовок .

Так что мой вопрос - почему он так себя ведет?Это кажется неправильным, основываясь на спецификации HTTP, и другие браузеры не ведут себя таким образом.Это просто ошибка?Конечно, это создает хаос в любом серьезном веб-приложении на основе AJAX.

Справочная информация:

Существует аналогичная проблема, вызванная тайм-аутами активности активности HTTP, которые короче, чем1 минута и задокументировано здесь:

http://us.generation -nt.com / xmlhttprequest-post-иногда-сбои-когда-сервер-keep-aliv-help-188813541.html

http://support.microsoft.com/default.aspx?kbid=831167

Вот перехват пакетов до и после сбоя:

Обратите внимание, как отправляются заголовок и полезная нагрузка HTTP http://img827.imageshack.us/i/beforee.png/

Послеошибка, обратите внимание, как отправляется только заголовок.IE никогда не отправляет полезную нагрузку, и сервер в конечном итоге отвечает Таймаутом.http://img203.imageshack.us/i/retryt.png/

Ответы [ 6 ]

27 голосов
/ 01 февраля 2011

Кажется, что нет четкого ответа на этот вопрос, поэтому я предоставлю свои эмпирические данные в качестве замены и предоставлю некоторые способы обойти это. Может быть, какой-нибудь инсайдер из MS однажды прояснит это ...

  1. Если HTTP Keep-Alive отключен на сервере, эта проблема исчезнет. Другими словами, ваш сервер HTTP 1.1 будет отвечать на каждый запрос Ajax с помощью строки Connection: Close в ответе. Это делает IE счастливым, но заставляет каждый Ajax-запрос открывать новое соединение. Это может оказать значительное влияние на производительность, особенно в сетях с высокой задержкой.

  2. Эта проблема легко вызывается, если запросы Ajax выполняются в быстрой последовательности. Например, мы делаем запросы Ajax каждые 100 мс, а затем меняется состояние сети, ошибку легко воспроизвести. Хотя большинство приложений, вероятно, не делают такие запросы, вполне возможно, что сразу после этого будут происходить несколько обращений к серверу, которые могут привести к этой проблеме. Меньше болтливости делает IE счастливым.

  3. Это происходит даже без аутентификации NTLM.

  4. Это происходит, когда ваш тайм-аут активности HTTP на сервере короче, чем значение по умолчанию (по умолчанию в Windows 60 секунд). Подробности указаны в ссылке на вопрос.

  5. Этого не происходит с Chrome или Firefox. FF отправляет один пакет, поэтому, похоже, полностью избегает этой проблемы.

  6. Это происходит в IE 6, 7, 8. Не удается воспроизвести в бета-версии IE 9.

11 голосов
/ 28 апреля 2011

Статья в Microsoft KB под названием Когда вы используете Microsoft Internet Explorer или другую программу для выполнения операции повторного POST, публикуются только данные заголовка , кажется, решает эту проблему.

Статья содержит исправление.В более поздних браузерах, таких как IE8, говорится, что исправление уже включено , но его необходимо включить через настройки реестра на клиентском ПК.

2 голосов
/ 27 января 2011

У меня была похожая проблема, когда некоторые старые версии IE отправляли обратно только заголовок, а не тело сообщения POST. Моя проблема оказалась связана с IE и NTLM. Поскольку вы не упомянули NTLM, это, вероятно, не поможет, но на всякий случай:

http://support.microsoft.com/kb/251404

1 голос
/ 30 января 2011

Используете ли вы аутентификацию NTLM?

При использовании аутентификации NTLM IE не отправляет пост-данные.Он отправляет информацию заголовка, ожидает авторизацию отправки неавторизованного ответа и после «повторной аутентификации» отправляет сообщение.

1 голос
/ 26 января 2011

Это длинный снимок, но IE (и даже Firefox) иногда «запоминает» соединение, которое он использует для запроса HTTP. Примечания / примеры:

  • В Firefox, если я изменю настройки прокси и нажму SHIFT-RELOAD на страница, он все еще использует старый прокси. Однако, если я убью старого прокси («killall squid»), он начинает использовать новый прокси.

  • При отключении / повторном подключении вы получаете новый IP-адрес или что-нибудь подобное? Можете ли вы как-то контролировать старый IP-адрес, чтобы увидеть если IE отправляет данные на этот мертвый адрес?

  • Я предполагаю, что IE отправляет данные, просто неправильно дорожка. Это может быть достаточно умно, чтобы не кэшировать сетевые соединения для Пакеты "POST", но могут быть недостаточно умными, чтобы сделать это для POST Полезная нагрузка.

  • Это, вероятно, не влияет на большинство приложений AJAX, так как люди редко отключить и заново подключиться к своим сетям?

0 голосов
/ 25 января 2016

У меня была похожая проблема сегодня при использовании $ .ajax, и я смог ее исправить, установив async в false.

$.ajax({
  async: false, 
  url: '[post action url]',
  data: $form.serialize(),
  type: 'POST',
  success: successCallback
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...