JQuery, XMLHttpRequest et Code de statut 0
-
19-09-2019 - |
Question
Je l'ai récemment fait quelques javascript Cross-domaine à l'aide JSONP et ASP.NET MVC.
Le particulier l'action du contrôleur ne répond à une requête POST, c'est par la conception.
IE8, je vois (via Fiddler2) que la réponse est correcte, et renvoyer une réponse HTTP 200, ainsi que le javascript JSONP.
Firefox, Safari et Chrome, la réponse est encore renvoyé, avec le code HTTP 200 et le contenu appropriés JSONP, la seule différence est que l'objet de XmlHttpRequest utilisé par JQuery met le code d'état 0, et la responseText à vide.
A l'origine, je pensais que cela était dû à COR HTTP preflighting (Http Access Control), un en-tête personnalisé ou un type de contenu autre que text / plain provoqueraient une requête HTTP supplémentaire (avec un OPTIONS) verbe être envoyé à le serveur. Je peux voir dans Fiddler2 que la demande OPTIONS est répondu à un HTTP 404.
Le serveur Web est IIS7 (mais le serveur Web de production sera une boîte IIS6). Dans IIS7, je peux voir la OPTIONSVerbHandler norme figurant dans les gestionnaires, mais je ne suis pas convaincu que c'est en train de faire quoi que ce soit (en fait, je ne peux même pas trouver de la documentation sur le OPTIONSVerbHandler partout).
Pour contourner cela, je modifed la bibliothèque JQuery ne pas définir l'en-tête personnalisé, et changer le type de contenu text / plain au lieu de l'application / JSON et Firefox démarre enfin sans passer par la demande OPTIONS, et seulement POSTs plaine.
Le problème réside encore dans une réponse vide (en accord avec l'objet XmlHttpRequest), même si Fiddler2 montre qu'une réponse HTTP 200 avec succès, avec un contenu est retourné.
Toute aide?
La solution
Il s'avère, vous ne pouvez pas utiliser des appels inter-domaines avec JQuery en utilisant POST (ce qui est logique, car elle rend une balise de script pour effectuer l'appel). Le passage à la question GET triés, et maintenant tout est de retour correctement.
Nous avons dû marcher à travers la source JQuery pour comprendre cela, mais merci pour la réponse.
Matt
Autres conseils
Essayez d'utiliser Firebug dans Firefox pour voir envoyé la demande réelle. Consultez l'onglet net pour voir la requête HTTP et la réponse. Peut-être que quelque chose est mal configuré? Je l'utilise aussi JSONView dans Firefox pour afficher les données JSON qui définit le applcaiton / JSON mimietype. Malheureusement, il ne gère pas JSONP, mais sa fin.
Autre que toutes les erreurs évidentes du côté client, la raison principale est que le moteur gecko recherche le Access-Control-Allow-Origin
dans l'en-tête de la servlet
. Si elle ne trouve pas, il annulerait la communication et vous obtenez un status=0
et statusText=null
. En outre, le moz-nullprincipal
en erreur d'analyse XML. Toutes ces choses est très trompeur. Tout ce que vous devez résoudre ce problème est:
response.setHeader("Access-Control-Allow-Origin","*");
Dans le code servlet
et la vie sera bon :-)
En fait pas le cas. Firefox envoie un en-tête OPTION comme suit:
Voici ce qui se prépare par le client dans Firefox:
OPTIONS /MvcApplication/Json/Test1 HTTP/1.1 Host: acoheni580 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 115 Connection: keep-alive Origin: http://localhost Access-Control-Request-Method: POST
Mvc ne sait pas comment gérer cela parce qu'il est à la recherche que pour un en-tête POST lorsque vous utilisez l'[HttpPost]
attribut
Pour autoriser manuellement ceci:
//[HttpPost]
[AcceptVerbs(new string[] {"POST","OPTIONS"})]