Verwenden von JSONP

JSON Padding (JSONP) ist ein Mechanismus, der in Webbrowsern die siteübergreifende Skriptunterstützung ermöglicht. Das Design von JSONP basiert darauf, dass Webbrowser Skripts von einer Website laden können, die sich von der Website unterscheidet, von der das momentan geladene Dokument abgerufen wurde. Der Mechanismus funktioniert, indem die JSON-Nutzlast als Padding den Namen einer benutzerdefinierten Rückruffunktion (callback) erhält. Dies wird im folgenden Beispiel veranschaulicht.

callback({"a" = \\"b\\"});

Im obigen Beispiel wird die JSON-Nutzlast, {"a" = \\"b\\"}, mit einem Funktionsaufruf, callback, als Wrapper versehen. Die Rückruffunktion muss auf der aktuellen Webseite bereits definiert sein. Der Inhaltstyp einer JSONP-Antwort ist application/javascript.

JSONP ist nicht automatisch aktiviert. Legen Sie zum Aktivieren auf einem der HTTP Standardendpunkte (javascriptCallbackEnabled oder true) das WebHttpEndpoint-Attribut auf WebScriptEndpoint fest. Dies wird im folgenden Beispiel veranschaulicht.

<system.serviceModel>
  <standardEndpoints>
    <webHttpEndpoint>
      <standardEndpoint name="" javascriptCallbackEnabled="true"/>
    </webHttpEndpoint>
  </standardEndpoints>
</system.serviceModel>

Sie können den Namen der Rückruffunktion in einer Abfragevariable mit dem Namen "callback" angeben, wie in der folgenden URL gezeigt.

http://baseaddress/Service/RestService?callback=functionName

Nach dem Aufrufen sendet der Dienst eine Antwort wie im folgenden Beispiel.

functionName({"root":"Something"});

Sie können den Rückruffunktionsnamen auch angeben, indem Sie das JavascriptCallbackBehaviorAttribute auf die Dienstklasse anwenden, wie im folgenden Beispiel gezeigt.

[ServiceContract]
[JavascriptCallbackBehavior(ParameterName = "$callback")]
public class Service1
{
    [OperationContract]
    [WebGet(ResponseFormat=WebMessageFormat.Json)]
    public string GetData()
    {
    }
}

Für den oben gezeigten Dienst sieht eine Anforderung wie folgt aus.

http://baseaddress/Service/RestService?$callback=anotherFunction

Nach dem Aufrufen reagiert der Dienst wie folgt.

anotherFunction ({"root":"Something"});

HTTP-Statuscodes

JSONP-Antworten mit anderen HTTP-Statuscodes als 200 enthalten einen zweiten Parameter mit der numerischen Darstellung des HTTP-Statuscodes, wie im folgenden Beispiel gezeigt.

anotherFunction ({"root":"Something"}, 201);

Überprüfungen

Wenn JSONP aktiviert ist, werden die folgenden Validierungen ausgeführt:

  • Die WCF-Infrastruktur löst eine Ausnahme aus, wenn javascriptCallback aktiviert, in der Anforderung der Abfragezeichenfolgenparameter "callback" vorhanden und das Antwortformat auf JSON festgelegt ist.

  • Falls die Anforderung den Abfragezeichenfolgenparameter "callback" enthält, der Vorgang jedoch nicht vom Typ HTTP GET ist, wird der Parameter "callback" ignoriert.

  • Falls der Rückrufname null lautet oder eine leere Zeichenfolge ist, wird die Antwort nicht als JSONP formatiert.

Weitere Informationen