Freigeben über


Verwenden von JSONP

JSON Padding (JSONP) ist ein Mechanismus, der die Unterstützung der website-übergreifenden Skriptausführung in Webbrowsern ermöglicht. JSONP basiert auf der Fähigkeit von Webbrowsern, Skripts von einer anderen Website als der zu laden, von der das aktuell geladene Dokument stammt. Der Mechanismus funktioniert, indem die JSON-Nutzlast mit einem benutzerdefinierten Rückruffunktionsnamen aufgefüllt wird, wie im folgenden Beispiel gezeigt.

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

Im vorherigen Beispiel wird die JSON-Nutzlast {"a" = \\"b\\"}in einen Funktionsaufruf eingeschlossen. callback Die Rückruffunktion muss bereits auf der aktuellen Webseite definiert sein. Der Inhaltstyp einer JSONP-Antwort lautet application/javascript.

JSONP ist nicht automatisch aktiviert. Um es zu aktivieren, legen Sie das javascriptCallbackEnabled Attribut true auf einen der HTTP-Standardendpunkte (WebHttpEndpoint oder WebScriptEndpoint), wie im folgenden Beispiel gezeigt.

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

Der Name der Rückruffunktion kann in einer Abfragevariable namens callback angegeben werden, wie in der folgenden URL dargestellt.

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

Wenn der Dienst aufgerufen wird, sendet der Dienst eine Antwort wie die folgende.

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

Sie können auch den Namen der Rückruffunktion angeben, indem Sie die JavascriptCallbackBehaviorAttribute 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 zuvor gezeigten Dienst sieht eine Anforderung wie folgt aus.

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

Wenn der Dienst aufgerufen wird, antwortet 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);

Bestätigungen

Die folgenden Überprüfungen werden ausgeführt, wenn JSONP aktiviert ist:

  • Die WCF-Infrastruktur löst eine Ausnahme aus, wenn javascriptCallback aktiviert ist, ein Rückruf-Query-String-Parameter in der Anforderung vorhanden ist und das Antwortformat auf JSON festgelegt ist.

  • Wenn die Anforderung den Parameter für die Rückrufabfragezeichenfolge enthält, der Vorgang jedoch kein HTTP GET ist, wird der Rückrufparameter ignoriert.

  • Wenn der Rückrufname oder die leere Zeichenfolge ist null , ist die Antwort nicht als JSONP formatiert.

Siehe auch