Partager via


JSONP

L’exemple JSONP montre comment prendre en charge JSON avec padding (JSONP) dans les services REST WCF. JSONP est une convention utilisée pour appeler des scripts inter-domaines en générant des balises de script dans le document actif. Le résultat est retourné dans une fonction de rappel spécifiée. JSONP est basé sur l’idée que les balises telles <script src="http://..." > que peuvent évaluer des scripts à partir de n’importe quel domaine et le script récupéré par ces balises est évalué dans une étendue dans laquelle d’autres fonctions peuvent déjà être définies.

Montre ce qui suit

Script inter-domaines avec JSONP.

Discussions

L’exemple inclut une page Web qui ajoute dynamiquement un bloc de script une fois la page rendue dans le navigateur. Ce bloc de script appelle un service REST WCF qui a une seule opération. GetCustomer Le service REST WCF retourne le nom et l’adresse d’un client encapsulés dans un nom de fonction de rappel. Lorsque le service REST WCF répond, la fonction de rappel sur la page Web est appelée avec les données client et la fonction de rappel affiche les données sur la page Web. L’injection de la balise de script et l’exécution de la fonction de rappel est automatiquement gérée par le contrôle ASP.NET AJAX ScriptManager. Le modèle d’utilisation est identique à tous les proxys AJAX ASP.NET, avec l’ajout d’une ligne pour activer JSONP, comme indiqué dans le code suivant :

var proxy = new JsonpAjaxService.CustomerService();
proxy.set_enableJsonp(true);
proxy.GetCustomer(onSuccess, onFail, null);

La page Web peut appeler le service REST WCF, car le service utilise le WebScriptEndpoint avec la valeur crossDomainScriptAccessEnabled définie sur true. Ces deux configurations sont effectuées dans le fichier Web.config sous l’élément <system.serviceModel> .

<system.serviceModel>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
  <standardEndpoints>
    <webScriptEndpoint>
      <standardEndpoint name="" crossDomainScriptAccessEnabled="true"/>
    </webScriptEndpoint>
  </standardEndpoints>
</system.serviceModel>

ScriptManager gère l’interaction avec le service et masque la complexité de l’implémentation manuelle de l’accès JSONP. Lorsqu'on définit crossDomainScriptAccessEnabled sur true et que le format de réponse d'une opération est JSON, l'infrastructure WCF inspecte l'URI de la requête pour rechercher un paramètre de chaîne de requête de rappel et encapsule la réponse JSON avec la valeur du paramètre de chaîne de requête de rappel. Dans l’exemple, la page Web appelle le service REST WCF avec l’URI suivant.

http://localhost:33695/CustomerService/GetCustomer?callback=Sys._json0

Étant donné que le paramètre de chaîne de requête de rappel a une valeur de JsonPCallback, le service WCF retourne une réponse JSONP, comme illustré dans l'exemple suivant.

Sys._json0({"__type":"Customer:#Microsoft.Samples.Jsonp","Address":"1 Example Way","Name":"Bob"});

Cette réponse JSONP inclut les données client mises en forme au format JSON, encapsulées avec le nom de la fonction de rappel demandée par la page Web. ScriptManager exécutera ce rappel à l'aide d'une balise de script pour réaliser la requête inter-domaines, puis passera le résultat au gestionnaire onSuccess de l'opération GetCustomer du proxy AJAX ASP.NET.

L’exemple se compose de deux applications web ASP.NET : l’une contient uniquement un service WCF, et une autre contient la page web .aspx, qui appelle le service. Lors de l’exécution de la solution, Visual Studio hébergera les deux sites web sur différents ports, ce qui crée un environnement où le service et le client vivent sur différents domaines.

Exécution de l'exemple

  1. Ouvrez la solution pour l'exemple de JSONP.

  2. appuyez sur F5 pour lancer http://localhost:26648/JSONPClientPage.aspx dans le navigateur.

  3. Notez qu’une fois la page chargée, les entrées de texte pour « Name » et « Address » sont remplies par des valeurs. Ces valeurs ont été fournies à partir d’un appel au service WCF une fois que le navigateur a terminé le rendu de la page.