За последние пару месяцев я провел много исследований в этой области - прежде чем углубляться в детали, мое веб-приложение использует GWT 2.x, работающий на Tomcat 7, с Apache httpd 2.2.x и mod_jk. 1.2.x установка спереди.
С mod_jk версии 1.2.26 я иногда вижу ошибку «encodedRequest не может быть пустым» в журналах. Как говорится в вопросе, это произойдет только в IE, для меня только в IE8 / 9. Проблема в том, что моей серверной ОС является Linux, поэтому проблема с аутентификацией NTLM не возникает. В более новых версиях mod_jk (1.2.37 на момент написания этой статьи) вместо этого я получал бы таймаут сокета и ошибку чтения в журналах Tomcat.
Эта ошибка будет регистрироваться во время опроса моего веб-приложения на сервере каждые несколько секунд, чтобы получить статус длительной операции, которая была запущена в отдельном потоке. Опрос происходил бы каждые пять секунд, но иногда он зависал при выполнении этого запроса состояния.
После многих команд tcpdump я обнаружил, что зависший запрос приходит по TCP-соединению, которое сбрасывается Apache; FIN / ACK отправляется в браузер, заголовок и тело запроса POST будут получены сервером, и сервер продолжит сброс соединения. Тогда, как ни странно, только заголовок вернется на сервер из браузера. После небольшого исследования я нашел это:
Почему Internet Explorer не отправляет тело сообщения HTTP при вызове Ajax после сбоя?
По-видимому, IE будет отправлять заголовки только во время повторной отправки запроса POST. По истинной моде Microsoft эта проблема уже давно известна, было выпущено и установлено исправление, но НЕ ВКЛЮЧЕНО на клиентском компьютере. Если вы не хотите заставлять всех своих пользователей редактировать свой реестр, вам нужно либо отключить HTTP Keep-Alive на своем сервере, либо увеличить время ожидания Keep-Alive до> 60 секунд. Для моего сервера Apache httpd я установил для KeepAliveTimeout значение 65, а для MaxKeepAliveRequests - значение 0, чтобы сервер не инициировал сброс подключения к браузеру.