Verwenden von JSONPUsing JSONP

JSON Padding (JSONP) ist ein Mechanismus, der in Webbrowsern die siteübergreifende Skriptunterstützung ermöglicht.JSON Padding (JSONP) is a mechanism that enables cross-site scripting support in Web browsers. 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.JSONP is designed around the ability of Web browsers to load scripts from a site different from the one the current loaded document was retrieved from. Der Mechanismus funktioniert, indem die JSON-Nutzlast als Padding den Namen einer benutzerdefinierten Rückruffunktion (callback) erhält. Dies wird im folgenden Beispiel veranschaulicht.The mechanism works by padding the JSON payload with a user-defined callback function name, as shown in the following example.

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

Im obigen Beispiel wird die JSON-Nutzlast, {"a" = \\"b\\"}, mit einem Funktionsaufruf, callback, als Wrapper versehen.In the preceding example the JSON payload, {"a" = \\"b\\"}, is wrapped in a function call, callback. Die Rückruffunktion muss auf der aktuellen Webseite bereits definiert sein.The callback function must already be defined in the current Web page. Der Inhaltstyp einer JSONP-Antwort ist application/javascript.The content type of a JSONP response is application/javascript.

JSONP ist nicht automatisch aktiviert.JSONP is not automatically enabled. Legen Sie zum Aktivieren auf einem der HTTP Standardendpunkte (javascriptCallbackEnabled oder true) das WebHttpEndpoint-Attribut auf WebScriptEndpoint fest. Dies wird im folgenden Beispiel veranschaulicht.To enable it, set the javascriptCallbackEnabled attribute to true on one of the HTTP standard endpoints (WebHttpEndpoint or WebScriptEndpoint), as shown in the following example.

<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.The name of the callback function can be specified in a query variable called callback as shown in the following URL.

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

Nach dem Aufrufen sendet der Dienst eine Antwort wie im folgenden Beispiel.When invoked, the service sends a response like the following.

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

Sie können den Rückruffunktionsnamen auch angeben, indem Sie das JavascriptCallbackBehaviorAttribute auf die Dienstklasse anwenden, wie im folgenden Beispiel gezeigt.You can also specify the callback function name by applying the JavascriptCallbackBehaviorAttribute to the service class, as shown in the following example.

[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.For the service shown previously, a request looks like the following.

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

Nach dem Aufrufen reagiert der Dienst wie folgt.When invoked, the service responds with the following.

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

HTTP-StatuscodesHTTP Status Codes

JSONP-Antworten mit anderen HTTP-Statuscodes als 200 enthalten einen zweiten Parameter mit der numerischen Darstellung des HTTP-Statuscodes, wie im folgenden Beispiel gezeigt.JSONP responses with HTTP status codes other than 200 include a second parameter with the numeric representation of the HTTP status code, as shown in the following example.

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

ValidierungenValidations

Wenn JSONP aktiviert ist, werden die folgenden Validierungen ausgeführt:The following validations are performed when JSONP is enabled:

  • 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.The WCF infrastructure throws an exception if javascriptCallback is enabled, a callback query-string parameter is present in the request and the response format is set to JSON.

  • Falls die Anforderung den Abfragezeichenfolgenparameter "callback" enthält, der Vorgang jedoch nicht vom Typ HTTP GET ist, wird der Parameter "callback" ignoriert.If the request contains the callback query string parameter but the operation is not an HTTP GET, the callback parameter is ignored.

  • Falls der Rückrufname null lautet oder eine leere Zeichenfolge ist, wird die Antwort nicht als JSONP formatiert.If the callback name is null or empty string the response is not formatted as JSONP.

Siehe auchSee also

Überblick über das WCF-Web-HTTP-ProgrammiermodellWCF Web HTTP Programming Model Overview