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?

Était-ce utile?

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"})]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top