web-dev-qa-db-fra.com

Pourquoi Internet Explorer n'envoie-t-il pas le corps du message HTTP lors d'un appel Ajax après l'échec?

Nous sommes en mesure de recréer de manière fiable le scénario suivant:

  1. Créer une petite page HTML qui fait AJAX requêtes à un serveur (en utilisant HTTP POST)
  2. Se déconnecter du réseau et se reconnecter
  3. Surveillez les paquets générés par IE après l'échec)

Après une connexion réseau ayant échoué, IE effectue la prochaine requête AJAX mais n'envoie que l'en-tête HTTP (pas le corps) lors de la publication HTTP. Cela provoque toutes sortes de problèmes sur le serveur car il ne s'agit que d'une demande partielle. Google ce problème avec Bing et vous trouverez beaucoup de gens se plaignant de "serveur aléatoire erreurs "en utilisant AJAX ou inexpliqué AJAX échecs.

Nous savons que IE (contrairement à la plupart des autres navigateurs) envoie toujours un HTTP POST comme DEUX paquets TCP/IP. L'en-tête et le corps sont envoyés séparément. Dans le cas directement après un échec, IE envoie uniquement l'en-tête .

Alors ma question est - pourquoi se comporte-t-il de cette façon? Cela semble mal basé sur la spécification HTTP et les autres navigateurs ne se comportent pas de cette façon. Est-ce simplement un bug? Cela crée certainement des ravages dans toute application Web sérieuse AJAX.

Informations de référence:

Il existe un problème similaire, déclenché par des délais d'expiration HTTP persistants inférieurs à 1 minute et documenté ici:

http://us.generation-nt.com/xmlhttprequest-post-sometimes-fails-when-server-using-keep-aliv-help-188813541.html

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

Voici les captures de paquets avant et après échec:

Remarquez comment l'en-tête HTTP et la charge utile sont envoyés http://img827.imageshack.us/i/beforee.png/

Après un échec, notez comment seul l'en-tête est envoyé. IE jamais envoie la charge utile et le serveur répond finalement avec un Timeout. http://img203.imageshack.us/i/retryt.png/

113
Dodgyrabbit

Il ne semble pas y avoir de réponse claire à cette question, je vais donc fournir mes données empiriques comme substitut et fournir quelques moyens de contourner ce problème. Peut-être qu'un initié de la SP fera un jour la lumière là-dessus ...

  1. Si HTTP Keep-Alive est désactivé sur le serveur, ce problème disparaît. En d'autres termes, votre serveur HTTP 1.1 répondra à chaque demande Ajax par un Connection: Close ligne dans la réponse. Cela maintient IE heureux mais provoque l'ouverture d'une nouvelle connexion à chaque requête Ajax. Cela peut avoir un impact significatif sur les performances, en particulier sur les réseaux à latence élevée.

  2. Le problème se déclenche facilement si les demandes Ajax sont effectuées en succession rapide. Par exemple, nous faisons des requêtes Ajax toutes les 100 ms, puis l'état du réseau change, l'erreur est facile à reproduire. Bien que la plupart des applications ne fassent probablement pas de telles demandes, vous pourriez très bien avoir deux appels de serveur qui se succèdent, ce qui pourrait entraîner ce problème. Moins bavard garde IE heureux.

  3. Cela se produit même sans authentification NTLM.

  4. Cela se produit lorsque le délai d'expiration de la connexion HTTP sur le serveur est plus court que celui par défaut (qui est par défaut de 60 secondes sous Windows). Détails fournis dans le lien en question.

  5. Cela ne se produit pas avec Chrome ou Firefox. FF envoie un paquet et semble donc éviter complètement ce problème.

  6. Cela se produit dans IE 6, 7, 8. Impossible de reproduire avec IE 9 beta.

27
Dodgyrabbit

L'article Microsoft KB intitulé Lorsque vous utilisez Microsoft Internet Explorer ou un autre programme pour effectuer une opération de re-POST, seules les données d'en-tête sont publiées semble résoudre ce problème.

L'article fournit un correctif. Pour les navigateurs ultérieurs tels que IE8, il indique que le correctif est déjà inclus mais doit être activé via les paramètres de registre sur le PC client.

11
Julian

J'ai eu un problème similaire où certaines anciennes versions de IE renverraient uniquement l'en-tête et non le corps d'un POST. Mon problème s'est avéré être lié à IE et NTLM. Puisque vous n'avez pas mentionné NTLM, cela n'aide probablement pas, mais juste au cas où:

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

2
reassembler

C'est un long shot, mais IE (et même Firefox) "se souvient" parfois de la connexion qu'il utilise pour une requête HTTP. Notes/exemples:

  • Dans Firefox, si je modifie les paramètres du proxy et appuie sur SHIFT-RELOAD sur une page, il utilise toujours l'ancien proxy. Cependant, si je tue l'ancien proxy ("killall squid"), il commence à utiliser le nouveau proxy.

  • Lorsque vous vous déconnectez/reconnectez-vous, recevez-vous une nouvelle adresse IP ou quelque chose de similaire? Pouvez-vous en quelque sorte surveiller l'ancienne adresse IP pour voir si IE envoie des données à cette adresse maintenant morte?

  • Je suppose que IE envoie les données, juste sur le mauvais chemin. Il peut être assez intelligent pour ne pas mettre en cache les connexions réseau pour les paquets "POST", mais peut-être pas assez intelligent pour le faire pour POST charges utiles.

  • Cela n'affecte probablement pas la plupart des applications AJAX, car les gens se déconnectent et se reconnectent rarement à leurs réseaux?

1
barrycarter

Utilisez-vous l'authentification NTLM?

Lorsque vous utilisez l'authentification NTLM, IE n'envoie pas de post-données. Il envoie des informations d'en-tête, attend une autorisation d'envoi de réponse non autorisée, et après la "ré-authentification" envoie le post.

1
The-MeLLeR