Freigeben über


JSONP

Das JSONP-Beispiel veranschaulicht, wie JSON mit Padding (JSONP) in WCF-REST-Diensten unterstützt wird. JSONP ist eine Konvention zum Aufrufen domänenübergreifender Skripts durch Generieren von Skripttags im aktuellen Dokument. Das Ergebnis wird in einer angegebenen Rückruffunktion zurückgegeben. JSONP basiert auf der Idee, dass Tags wie <script src="http://..." > z. B. Skripts aus einer beliebigen Domäne auswerten können und das von diesen Tags abgerufene Skript innerhalb eines Bereichs ausgewertet wird, in dem möglicherweise bereits andere Funktionen definiert werden.

Zeigt

Domänenübergreifendes Skripting mit JSONP.

Diskussion

Das Beispiel enthält eine Webseite, die dynamisch einen Skriptblock hinzufügt, nachdem die Seite im Browser gerendert wurde. Dieser Skriptblock ruft einen WCF-REST-Dienst auf, der über einen einzelnen Vorgang verfügt. GetCustomer Der WCF REST-Dienst gibt den Namen und die Adresse eines Kunden von einem Rückruffunktionsnamen umschlossen zurück. Wenn der WCF-REST-Dienst antwortet, wird die Rückruffunktion auf der Webseite mit den Kundendaten aufgerufen, und die Rückruffunktion zeigt die Daten auf der Webseite an. Die Einfügung des Skripttags und die Ausführung der Rückruffunktion wird automatisch vom ASP.NET AJAX ScriptManager-Steuerelement behandelt. Das Verwendungsmuster ist mit allen ASP.NET AJAX-Proxys identisch, mit dem Hinzufügen einer Zeile zum Aktivieren von JSONP, wie im folgenden Code gezeigt:

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

Die Webseite kann den WCF REST-Dienst aufrufen, da der Dienst den WebScriptEndpoint verwendet, wobei crossDomainScriptAccessEnabled auf true festgelegt wurde. Beide Konfigurationen werden in der datei Web.config unter dem <System.serviceModel-Element> ausgeführt.

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

ScriptManager verwaltet die Interaktion mit dem Dienst und blendet die Komplexität der manuellen Implementierung des JSONP-Zugriffs aus. Wenn crossDomainScriptAccessEnabled auf true gesetzt wird und das Antwortformat für einen Vorgang JSON ist, überprüft die WCF-Infrastruktur den URI der Anfrage auf einen Rückrufabfrage-Parameter und umschließt die JSON-Antwort mit dem Wert dieses Rückrufabfrage-Parameters. Im Beispiel ruft die Webseite den WCF-REST-Dienst mit dem folgenden URI auf.

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

Da der Parameter für die Rückrufabfragezeichenfolge einen Wert aufweist JsonPCallback, gibt der WCF-Dienst eine JSONP-Antwort zurück, die im folgenden Beispiel gezeigt wird.

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

Diese JSONP-Antwort enthält die Kundendaten, die als JSON formatiert sind, umschlossen mit dem Namen der Rückruffunktion, die die Webseite angefordert hat. ScriptManager führt diesen Rückruf mithilfe eines Skripttags aus, um die domänenübergreifende Anforderung auszuführen, und übergibt dann das Ergebnis an den onSuccess-Handler, der an den GetCustomer-Vorgang des ASP.NET AJAX-Proxy übergeben wurde.

Das Beispiel besteht aus zwei ASP.NET Webanwendungen: einer enthält nur einen WCF-Dienst, und ein weiteres enthält die .aspx Webseite, die den Dienst aufruft. Beim Ausführen der Lösung hosten Visual Studio die beiden Websites auf verschiedenen Ports, wodurch eine Umgebung erstellt wird, in der sich der Dienst und der Client in verschiedenen Domänen befinden.

So führen Sie das Beispiel aus

  1. Öffnen Sie die Lösung für das JSONP-Beispiel.

  2. Drücken Sie F5 , um im Browser zu starten http://localhost:26648/JSONPClientPage.aspx .

  3. Beachten Sie, dass nach dem Laden der Seite die Texteingaben für "Name" und "Adresse" durch Werte aufgefüllt werden. Diese Werte wurden von einem Aufruf des WCF-Diensts bereitgestellt, nachdem der Browser das Rendern der Seite abgeschlossen hat.