Je travaille sur la création d'un nouvel ensemble de services dans ASP.MVC MVC 4 à l'aide de l'API Web. Jusqu'à présent, c'est génial. J'ai créé le service et je l'ai fait fonctionner, et maintenant j'essaye de le consommer en utilisant JQuery. Je peux récupérer la chaîne JSON en utilisant Fiddler, et cela semble être correct, mais parce que le service existe sur un site séparé, en essayant de l'appeler avec des erreurs JQuery avec le "Not Allowed". Donc, c'est clairement un cas où je dois utiliser JSONP.
Je sais que l'API Web est nouvelle, mais j'espère que quelqu'un pourra m'aider.
Comment appeler une méthode API Web à l'aide de JSONP?
jquery
jsonp
asp.net-mvc-4
asp.net-web-api
Brian McCord
la source
la source
Réponses:
Après avoir posé cette question, j'ai finalement trouvé ce dont j'avais besoin, alors j'y réponds.
Je suis tombé sur ce JsonpMediaTypeFormatter . Ajoutez-le dans le
Application_Start
de votre global.asax en faisant ceci:et vous êtes prêt à utiliser un appel JQuery AJAX qui ressemble à ceci:
Cela semble fonctionner très bien.
la source
GlobalConfiguration.Configuration.AddJsonpFormatter(config.Formatters.JsonFormatter, "callback");
Voici une version mise à jour de JsonpMediaTypeFormatter à utiliser avec WebAPI RC:
la source
Vous pouvez utiliser un ActionFilterAttribute comme ceci:
Ensuite, mettez-le sur votre action:
la source
La réponse de Brian est certainement la bonne, mais si vous utilisez déjà le formateur Json.Net, qui vous donne de jolies dates json et une sérialisation plus rapide, vous ne pouvez pas simplement ajouter un deuxième formateur pour jsonp, vous devez combiner les deux. C'est une bonne idée de l'utiliser quand même, car Scott Hanselman a déclaré que la version de l'API Web ASP.NET utilisera le sérialiseur Json.Net par défaut.
la source
La mise en œuvre de Rick Strahl a travaillé le mieux pour moi avec RC.
la source
JSONP fonctionne uniquement avec la requête Http GET. Il existe un support CORS dans l'API web asp.net qui fonctionne bien avec tous les verbes http.
Cet article peut vous être utile.
la source
Actualisé
la source
Voici une version mise à jour avec plusieurs améliorations, qui fonctionne avec la version RTM des API Web.
Accept-Encoding
têtes de la demande . Lenew StreamWriter()
dans les exemples précédents utiliserait simplement UTF-8. L'appel àbase.WriteToStreamAsync
peut utiliser un codage différent, ce qui entraîne une sortie corrompue.application/javascript
Content-Type
tête; l'exemple précédent afficherait JSONP, mais avec l'en-application/json
tête. Ce travail se fait dans laMapping
classe imbriquée (cf. Meilleur type de contenu pour servir JSONP? )StreamWriter
et récupère directement les octets et les écrit dans le flux de sortie.ContinueWith
mécanisme de la bibliothèque parallèle de tâches pour enchaîner plusieurs tâches ensemble.Code:
Je suis conscient du "piratage" du
Func<string>
paramètre dans le constructeur de classe interne, mais c'était le moyen le plus rapide de contourner le problème qu'il résout - puisque C # n'a que des classes internes statiques, il ne peut pas voir laCallbackQueryParameter
propriété. Le fait de transmettreFunc
in lie la propriété dans le lambda,Mapping
vous pourrez donc y accéder plus tard dansTryMatchMediaType
. Si vous avez une manière plus élégante, veuillez commenter!la source
Malheureusement, je n'ai pas assez de réputation pour commenter, alors je posterai une réponse. @Justin a soulevé le problème de l'exécution du formateur WebApiContrib.Formatting.Jsonp parallèlement au format JsonFormatter standard. Ce problème est résolu dans la dernière version (en fait publiée il y a quelque temps). En outre, il devrait fonctionner avec la dernière version de l'API Web.
la source
johperl, Thomas. La réponse donnée par Peter Moberg ci-dessus devrait être correcte pour la version RC car le JsonMediaTypeFormatter dont il hérite utilise déjà le sérialiseur NewtonSoft Json, et donc ce qu'il a devrait fonctionner sans aucun changement.
Cependant, pourquoi diable les gens utilisent-ils encore des paramètres, alors que vous pourriez simplement faire ce qui suit
la source
Au lieu d'héberger votre propre version du formateur JSONP, vous pouvez installer le package WebApiContrib.Formatting.Jsonp NuGet avec un déjà implémenté (choisissez la version qui fonctionne pour votre .NET Framework).
Ajoutez ce formateur dans
Application_Start
:la source
Pour ceux d'entre vous qui utilisent HttpSelfHostServer, cette section de code échouera sur HttpContext.Current, car elle n'existe pas sur le serveur auto-hôte.
Cependant, vous pouvez intercepter le «contexte» de l'hôte autonome via ce remplacement.
Le request.Method vous donnera "GET", "POST", etc. et le GetQueryNameValuePairs peut récupérer le paramètre de rappel?. Ainsi mon code révisé ressemble à:
J'espère que cela aide certains d'entre vous. De cette façon, vous n'avez pas nécessairement besoin d'un shim HttpContext.
C.
la source
Vérifiez celui-ci. Voyez si cela aide.
JSONP avec API Web
la source
Si le contexte est
Web Api
, remerciant et faisant référence à010227leo
la réponse de, vous devez considérer laWebContext.Current
valeur qui va êtrenull
.J'ai donc mis à jour son code pour ceci:
la source
Nous pouvons résoudre le problème CORS (Cross-origin resource sharing) de deux manières,
1) Utilisation de Jsonp 2) Activation du Cors
1) En utilisant Jsonp- pour utiliser le Jsonp, nous devons installer le package nuget WebApiContrib.Formatting.Jsonp et ajouter JsonpFormmater dans WebApiConfig.cs se référer aux captures d'écran,
Code Jquery
2) Activation du Cors -
pour activer les cors, nous devons ajouter le package nuget Microsoft.AspNet.WebApi.Cors et activer les cors dans WebApiConfig.cs, reportez-vous à la capture d'écran
Pour plus de références, vous pouvez consulter mon exemple de dépôt sur GitHub en utilisant le lien suivant. https://github.com/mahesh353/Ninject.WebAPi/tree/develop
la source