JSONP avec ASP.NET Web API
Je suis en train de travailler sur la création d'un nouvel ensemble de services en ASP.MVC MVC 4 à l'aide de l'API Web. Jusqu'à présent, c'est génial. J'ai créé le service et eu à le faire fonctionner, et maintenant je suis en train de le consommer à l'aide de JQuery. Je peux revenir à la chaîne JSON à l'aide de Fiddler, et il semble être ok, mais parce que le service existe sur un autre site, en essayant de l'appeler avec JQuery erreurs avec le "Pas Autorisé". Donc, c'est clairement un cas où j'ai besoin d'utiliser JSONP.
Je sais que le Web API est nouveau, mais j'espère que quelqu'un pourra m'aider.
Comment puis-je faire un appel à une API Web à l'aide de la méthode JSONP?
- Viens de regarder dans la nouvelle API de Web structure après avoir vu le ScottGu vidéo sur Channel 9, et la lecture de l'Scott, Hanselman article, et ce fut une de mes premières réflexions/questions à ce sujet.
Vous devez vous connecter pour publier un commentaire.
Après avoir posé cette question, j'ai enfin trouvé ce dont j'avais besoin, je suis donc d'y répondre.
J'ai couru à travers ce JsonpMediaTypeFormatter. L'ajouter dans la
Application_Start
globale de votre.asax en faisant ceci:et vous êtes bon pour aller avec un JQuery AJAX appel qui ressemble à ceci:
Il semble fonctionner très bien.
'System.Web.Http.HttpConfiguration' does not contain a definition for 'AddJsonpFormatter' and no extension method 'AddJsonpFormatter' accepting a first argument of type 'System.Web.Http.HttpConfiguration' could be found (are you missing a using directive or an assembly reference?)
GlobalConfiguration.Configuration.AddJsonpFormatter(config.Formatters.JsonFormatter, "callback");
Ici est une version mise à jour de la JsonpMediaTypeFormatter pour une utilisation avec WebAPI RC:
Vous pouvez utiliser un ActionFilterAttribute comme ceci:
Puis le mettre sur votre action:
Certainement de Brian réponse est correcte, cependant, si vous utilisez déjà l'Json.Net formateur, qui vous donne assez json dates et les plus rapides de la sérialisation, alors vous ne pouvez pas ajouter un deuxième formateur pour jsonp, vous devez combiner les deux. C'est une bonne idée de l'utiliser de toute façon, comme Scott, Hanselman a affirmé que la libération de ASP.NET l'API Web va utiliser la Json.Net sérialiseur par défaut.
Rick Strahl de la mise en œuvre qui a le mieux fonctionné pour moi avec le RC.
JSONP ne fonctionne qu'avec des requête Http GET. Il y a un soutien de la SCRO dans asp.net l'api web qui fonctionne bien avec tous les verbes http.
Cette article peut vous être utile.
Mis à jour
Voici une version mise à jour avec plusieurs améliorations, qui fonctionne avec la version RTM de l'Api Web.
Accept-Encoding
en-têtes. Lenew StreamWriter()
dans les exemples précédents, serait tout simplement d'utiliser l'UTF-8. L'appel àbase.WriteToStreamAsync
peut utiliser un autre encodage, entraînant une altération de sortie.application/javascript
Content-Type
l'en-tête; l'exemple précédent serait sortie de JSONP, mais avec leapplication/json
en-tête. Ce travail est réalisé dans le imbriquésMapping
classe (cf. Le meilleur type de contenu pour servir JSONP?)StreamWriter
et directement les octets et les écrit dans le flux de sortie.ContinueWith
mécanisme à chaîne de plusieurs tâches.Code:
Je suis conscient de la "hackiness" de la
Func<string>
paramètre à l'intérieur du constructeur de la classe, mais c'était le moyen le plus rapide pour contourner le problème, il n'en résout, et depuis C# n'a statique à l'intérieur des classes, il ne peut pas voir leCallbackQueryParameter
de la propriété. En passant laFunc
dans la lie de la propriété dans le lambda, doncMapping
sera en mesure d'accéder à plus tard, dansTryMatchMediaType
. Si vous avez un moyen plus élégant, s'il vous plaît commentaire!Malheureusement, je n'ai pas assez de réputation pour le commentaire, donc je vais poster une réponse. @Justin a soulevé la question de l'exécution de la WebApiContrib.La mise en forme.Jsonp formateur aux côtés de la norme JsonFormatter. Ce problème est résolu dans la dernière version (en fait sorti il y a quelques temps). Aussi, il devrait fonctionner avec la dernière API Web de libération.
johperl, Thomas. La réponse donnée par Peter Moberg ci-dessus doit être correcte pour la version RC comme le JsonMediaTypeFormatter qu'il hérite de utilise le NewtonSoft sérialiseur Json déjà, et donc ce qu'il a devrait fonctionner avec toutes les modifications.
Cependant, pourquoi sur la terre sont des gens toujours à l'aide des paramètres, où vous pouviez juste faire ce qui suit
Au lieu de l'hébergement de votre propre JSONP formateur de version, vous pouvez installer WebApiContrib.La mise en forme.Jsonp package NuGet avec déjà mis en œuvre un (choisissez la version qui fonctionne pour votre .NET Framework).
Ajouter ce formateur en
Application_Start
:Pour ceux d'entre vous qui sont à l'aide de la HttpSelfHostServer cette section de code suivant ne fonctionnera pas sur HttpContext.Actuel, car il n'existe pas sur l'auto serveur hôte.
Cependant, vous pouvez intercepter l'auto hôte "contexte" par cette substitution.
La demande.Méthode vous donnera "GET", "POST", etc. et le GetQueryNameValuePairs pouvez récupérer l' ?rappel paramètre. Donc mon code révisé ressemble:
Espère que cela aide certains d'entre vous. De cette façon, vous n'avez pas nécessairement besoin d'un HttpContext cale.
C.
Vérifier celui-ci dehors. Voir si ça aide.
JSONP avec l'API Web
Si le contexte est
Web Api
, le remerciant et en se référant à010227leo
's réponse, vous devez tenir compte deWebContext.Current
valeur qui va êtrenull
.J'ai donc mis à jour son code de cette fonction:
Nous pouvons résoudre les CORS(Cross-origin resource sharing)problème à l'aide de deux façons,
1)À L'Aide De Jsonp
2)l'Activation de la Scro
1)À L'Aide De Jsonp-
pour utiliser le Jsonp nous avons besoin d'installer WebApiContrib.La mise en forme.Jsonp package nuget
et besoin d'ajouter JsonpFormmater dans WebApiConfig.cs consultez les captures d'écran,
Jquery
2)l'Activation de la Scro -
pour activer la scro nous avons besoin d'ajouter de Microsoft.AspNet.WebApi.La scro package nuget et la nécessité de permettre à la scro en WebApiConfig.cs consultez la capture d'écran
Pour plus d'information, vous pouvez consulter mon exemple repo GitHub en utilisant le lien suivant.
https://github.com/mahesh353/Ninject.WebAPi/tree/develop