11
votes

Le tout premier xmlhttprequest échoue mais seulement sur IE9

J'ai un site que je saisis un nom d'utilisateur / mot de passe et cliquez sur un bouton de connexion. Le bouton de connexion fait un objet XMLHTTTPRequest et le tire.

sur chrome, firefox, opéra, safari, appareils Android, périphériques iOS Cela fonctionne bien. IE9 fonctionnera à la finition si longtemps que je suis sur une adresse HTTP et n'utilise pas https. P>

sur https, IE9 se comporte comme suit: p>

La première demande de connexion ne renvoie jamais rien. L'écran F12 montre ma demande de connexion dans l'onglet Réseau et tout a l'air correct. L'onglet de script ne jette jamais une erreur. Tout simplement rien ne se passe. P>

Voici la partie folle: - Si je clique sur Connexion une seconde fois, cela fonctionne réellement. - Si je clique sur Actualiser sur le navigateur, puis connectez-vous, cela fonctionnera aussi bien! P>

Je fais la demande de la demande suivante: P>

   $.ajax({
      "url": sUrl,
      "success": function (data, textStatus, x) {
         workerCallback(data, id, "");
      },
      "error": function (x, testStatus, errorThrown) {
         workerCallback("nc", id, errorThrown);
      },
      "contentType": "text/plain",
      "data": JSON.stringify(req),
      "dataType": "json",
      "timeout": 1600000,
      "type": "POST"
   });


10 commentaires

La cache est-elle propre? Avez-vous utilisé quelque chose comme Fiddler pour voir si les demandes sortent?


Le cache est propre. Grande suggestion sur la surveillance des demandes. J'ai ouvert Wireshark (Network Sniffer) et vérifié. Je ne vois rien de sortir quand je clique sur Connexion la première fois. La deuxième fois que je vois les demandes! Mais c'est-à-dire dit que cela a fait la demande ?!


Recherchez le code d'erreur: support.microsoft.com/kb/193625


Avez-vous essayé d'envelopper votre code dans une fonction et d'appeler une fois que le document est prêt: window.onload = fonction () {...}


Même problème, mais cette suggestion a aidé. Lorsque j'ai ouvert la page pour la première fois, la demande de connexion accrochée pour toujours. Lorsque j'ai cliqué sur rafraîchir, tout fonctionnait bien (économisez le comportement exact comme le bouton). J'ai reçu un message d'erreur cette fois dans la console: SEC7111: la sécurité HTTPS est compromise par https: // [mySite] /waitting.gif. L'URL que j'ai navigue pour est déjà https. Le code HTML pointe vers ce GIF comme une URL relative, pas un absolu. Je ne sais pas pourquoi cela serait ou s'il est lié.


Je me demande ce qui se passerait si vous essayiez le post avec jQuery. Peut-être qu'il y a une cale manquante pour ce navigateur dont vous avez besoin. Si JQuery fonctionne bien, cela peut être un indicateur du problème. J'espère que cela pourra aider.


Clintnash - Je refaite le code pour utiliser jquery.ajax (). Il fait exactement la même chose. Cela semble vraiment me confirmer que le bug peut être du côté du serveur, mais j'ai toujours besoin de savoir ce qui ne va pas pour dire à la gars du serveur ce qu'il faut corriger à sa fin. Le code mis à jour à l'aide de JQuery est en place au même endroit maintenant.


J'ai exactement le même genre de forme tout, tout fonctionne bien, mais toutes mes URL sont sur le même domaine. Pour le domaine croisé, XMLHTPArequest demande des options pour permettre l'origine. Peut-être que votre serveur ne traite pas. Certainement quelque chose ne va pas sur le côté serveur.


@Paul ne signifie-t-il pas exactement le contraire - que le problème ne soit pas servoureux?


Mes URL sont également sur le même domaine. Ce n'est pas croisé.


3 Réponses :


0
votes

Pendant le débogage sur la première demande, cela est passé par

Entrez la description de l'image ici < P> Il y a un poste connexe à cette erreur exacte ... Ie 9 Erreur JavaScript C00C023F

L'auteur Mettez ce qui suit dans Le gestionnaire onreadyStatechange xxx

Cela peut vous aider à pointer dans la bonne direction.


1 commentaires

Merci d'avoir cherché, mais cette erreur n'est pas réellement une erreur. Vous avez débogué dans la première fois que le prêt préparateur est défini. Dans ce cas, il est défini sur 1 parce qu'il est sur le point de faire appel à l'appel. La propriété Status ne sera pas encore définie, essayant ainsi de voir que dans le débogueur sera une erreur. Mon code vérifie l'état prêt et seulement l'état d'accès et ne jette pas une erreur.



1
votes

Cela semble être un problème étrange et il est difficile de le tester sans piquer autour du code sur un site HTTPS.

Si vous voulez une solution rapide, vous pouvez essayer de faire une demande initiale (factice), puis abandonnez-la immédiatement avec une courte degré d'ouverture et de faire une deuxième demande (réelle).

selon votre description, il devrait fonctionner.


5 commentaires

Vous pouvez fouiller le code. J'ai tout posté dans le lien dans la description de la prime.


Bien que ce soit tout à fait le piratage, j'ai mis à jour le code en fonction de votre commentaire et un autre. Maintenant, si un délai d'attente survient, je republique la demande - une fois seulement. Donc, c'est-à-dire que c'est maintenant un bon retard de retard dans la journalisation, mais cela fonctionnera à la fin. Si personne n'a une réponse exacte, je diviserai la prime entre vous et un autre.


Oui mais je n'ai pas de serveur HTTPS pour le tester. Vous n'avez pas à donner à la fois un long délai. Abandonnez d'abord une demande rapide et faites un autre tout de suite, et il devrait être rapide partout.


@galambalazs merci. Voici un Server HTTPS


@alambalazs Vous êtes correct sur le retard. Je l'ai changé de manière à ce que la seule demande de connexion initiale repose et seulement après quelques secondes délais, et une seule fois. Cela résout efficacement le problème, même s'il s'agit d'un hack!



0
votes
  • Les délais d'attente empêchent la demande d'être terminée Chez ReadyStat 1, et cela réussit après le reniflant du contenu.

  • Configurez l'authentification client SSL sur le formulaire de connexion à l'aide de la configuration du serveur Web

  • Insérez un élément caché (tel qu'une image) qui fait référence à une URL nécessitant une authentification client SSL

  • Utilisez un hyperlien gif de protocole relatif, tel que // exemple.com/image.gif , pour éviter le SEC7111 Vulnérabilité du contenu mixte

  • L'URL du Méthode ouverte correspond au domaine lorsque vous utilisez HTTP, mais pas HTTPS, qui provoque l'échec de la demande, mais les demandes suivantes sont de renverser à la Politique de zone de sécurité

  • Utilisez une comparaison entre fenêtre.location.protocol et document.location.protocol Pour vérifier si le script exécute dans le même contexte que la page < / p>

  • Envoi de JSON en tant que type MIME Texte / Uni Peut déclencher Contenu reniflant

  • comparer le Accepter l'en-tête entre les demandes qui échouent par rapport à ceux qui réussissent

  • La cache HTTPS peut être un problème

  • the Header de connexion peut avoir besoin d'être défini

  • Proxy La configuration peut être un problème

  • Le En-tête initial Les valeurs de réponse peuvent être trop volumineuses (par exemple, la description de l'état HTTP a une limite de 512 caractères)

  • document.ReadyState ne peut pas être complet sur le Demande, qui provoque Exécution prématurée Problèmes

  • Chèques de révocation de certificats peut bloquer le poste JSON initial, mais permettre aux demandes suivantes après le rappel GET

  • Propriétés de l'état DREAYSTAT et STATUS doit être référencé à l'aide du Portée de rappel Plutôt que la variable x pour éviter d'utiliser la portée de fermeture: xxx


5 commentaires

- J'utilise déjà un lien hypertexte relatif. Je n'ai eu qu'un numéro GIF la seule fois. - L'URL Open est relative, elle doit donc correspondre au domaine HTTPS. J'ai également utilisé l'URL complète pointant vers HTTPS et elle échoue toujours. - Quand il échoue, documenter.location.protocol et window.Location.Localisation.Protocal correspondent parfaitement comme https :. - J'ai essayé d'envoyer comme "application / json", mais cela n'avait aucun effet. - Une fois que j'ai changé le code en $ .AJAX (), il n'y avait aucune référence de 'X' nécessaire pour être commutée sur "Ceci". J'ai changé cela l'autre jour.


@Paul SweweTTE - commutation x à Ceci ne changera rien parce qu'ils se réfèrent à la même chose. Il n'y a pas de levage ici parce que c'est un fonctionExpression pas un fonction de fonctionnement , je ne pense pas avoir le la moindre idée de ce dont vous parlez. Voir: kangax.github.com/nfe


Le bouton Soumettre est-il dans un élément de formulaire? Si tel est le cas, il peut y avoir un condition de course ou une problématique Attribut d'action .


Le bouton Soumettre est une balise d'ancrage qui est stylé. Il n'y a pas d'éléments de forme.


Consultez le Accepter l'en-tête , Contenu mixte , Limitations croisées . Vérifiez Paramètres du navigateur et utilisez Fiddler pour dépanner.