javascript - support - ¿Por qué Internet Explorer no envía el cuerpo de la publicación HTTP en la llamada Ajax después de la falla?
angular-polyfills (6)
¿Estás usando autenticación NTLM?
Al usar la autenticación NTLM, IE no envía datos posteriores. Envía información de encabezado, espera una autorización de envío de respuesta no autorizada, y después de la ''re-autenticación'' envía la publicación.
Podemos recrear de forma confiable el siguiente escenario:
- Cree una pequeña página HTML que realice solicitudes AJAX a un servidor (utilizando HTTP POST)
- Desconectar de la red y reconectar
- Controle los paquetes que IE genera después de la falla
Después de una conexión de red fallida, IE realiza la siguiente solicitud AJAX pero solo envía el encabezado HTTP (no el cuerpo) al hacer la publicación HTTP. Esto causa todo tipo de problemas en el servidor, ya que es solo una solicitud parcial. Busque este problema con Bing y encontrará mucha gente quejándose de "errores aleatorios del servidor" usando AJAX o fallas inexplicables de AJAX.
Sabemos que IE (a diferencia de la mayoría de los otros navegadores) siempre envía un HTTP POST como DOS paquetes TCP / IP. El encabezado y el cuerpo se envían por separado. En el caso directamente después de una falla, IE solo envía el encabezado .
Entonces mi pregunta es: ¿por qué se comporta de esta manera? Parece incorrecto en función de la especificación HTTP y otros navegadores no se comportan de esta manera. ¿Es simplemente un error? Sin duda, esto crea estragos en cualquier aplicación web basada en AJAX.
Informacion de referencia:
Hay un problema similar, desencadenado por los tiempos de espera de mantenimiento de HTTP que son más cortos que 1 minuto y está documentado aquí:
http://support.microsoft.com/default.aspx?kbid=831167
Aquí están las capturas de paquetes de falla antes y después:
Observe cómo se envía el encabezado HTTP y la carga útil http://img827.imageshack.us/i/beforee.png/
Después de una falla, observe cómo solo se envía el encabezado. IE nunca envía la carga y el servidor finalmente responde con un tiempo de espera. http://img203.imageshack.us/i/retryt.png/
El artículo de Microsoft KB titulado Cuando se usa Microsoft Internet Explorer u otro programa para realizar una operación de re-POST, solo se publican los datos del encabezado parece solucionar este problema.
El artículo proporciona una revisión. Para navegadores posteriores como IE8, indica que la revisión ya está incluida, pero debe habilitarse a través de la configuración de registro en la PC del cliente.
Esto es una idea remota, pero IE (e incluso Firefox) algunas veces "recuerda" la conexión que usa para una solicitud HTTP. Notas / ejemplos:
En Firefox, si cambio la configuración del proxy y presiono SHIFT-RELOAD en una página, todavía usa el viejo proxy. Sin embargo, si elimino el viejo proxy ("killall squid"), comienza a usar el nuevo proxy.
Cuando se desconecta / reconecta, ¿recibe una nueva dirección IP o algo similar? ¿Puedes de alguna manera monitorear la dirección IP anterior para ver si IE está enviando datos a esa dirección ahora muerta?
Supongo que IE está enviando los datos, solo por el camino equivocado. Puede ser lo suficientemente inteligente como para no almacenar en caché las conexiones de red para los paquetes "POST", pero puede no ser lo suficientemente inteligente como para hacer eso para las cargas de POST.
Esto probablemente no afecte a la mayoría de las aplicaciones AJAX, ya que las personas rara vez se desconectan y se vuelven a conectar a sus redes.
Hoy tuve un problema similar al usar $ .ajax y pude arreglarlo estableciendo async en falso.
$.ajax({
async: false,
url: ''[post action url]'',
data: $form.serialize(),
type: ''POST'',
success: successCallback
});
No parece haber una respuesta clara a esta pregunta, así que proporcionaré mis datos empíricos como un sustituto y proporcionaré algunas formas de evitarlo. Quizás algún conocedor de EM algún día arroje algo de luz sobre esto ...
Si HTTP Keep-Alive está deshabilitado en el servidor, este problema desaparece. En otras palabras, su servidor HTTP 1.1 responderá a cada solicitud de Ajax con una
Connection: Close
línea deConnection: Close
en la respuesta. Esto mantiene feliz a IE pero hace que cada solicitud de Ajax abra una nueva conexión. Esto puede tener un impacto significativo en el rendimiento, especialmente en redes de alta latencia.El problema se desencadena fácilmente si las solicitudes Ajax se realizan en rápida sucesión. Por ejemplo, hacemos solicitudes de Ajax cada 100 ms y luego el estado de la red cambia, el error es fácil de reproducir. Aunque la mayoría de las aplicaciones probablemente no hagan tales solicitudes, es posible que tenga un par de llamadas al servidor ocurriendo una detrás de la otra, lo que podría conducir a este problema. Menos hablador mantiene IE feliz.
Sucede incluso sin autenticación NTLM.
Ocurre cuando su tiempo de espera de mantener activo HTTP en el servidor es más corto que el predeterminado (que por defecto es 60 segundos en Windows). Detalles proporcionados en el enlace en cuestión.
No sucede con Chrome o Firefox. FF envía un paquete por lo que parece evitar este problema por completo.
Sucede en IE 6, 7, 8. No se pudo reproducir con IE 9 beta.
Tuve un problema similar en el que algunas versiones anteriores de IE enviarían solo el encabezado y no el cuerpo de un mensaje POST. Mi problema resultó estar relacionado con IE y NTLM. Como no mencionó NTLM, probablemente esto no ayude, pero por las dudas: