Använda JSONP

JSON-utfyllnad (JSONP) är en mekanism som möjliggör stöd för skript mellan webbplatser i webbläsare. JSONP är utformat för möjligheten för webbläsare att läsa in skript från en annan webbplats än den som det aktuella inlästa dokumentet hämtades från. Mekanismen fungerar genom att lägga till extra data i JSON-nyttolasten med ett användardefinierat namn på återanropsfunktionen, som visas i exemplet nedan.

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

I föregående exempel omsluts JSON-nyttolasten , {"a" = \\"b\\"}i ett funktionsanrop, callback. Återanropsfunktionen måste redan ha definierats på den aktuella webbsidan. Innehållstypen för ett JSONP-svar är application/javascript.

JSONP aktiveras inte automatiskt. Om du vill aktivera det anger du javascriptCallbackEnabled attributet till true på någon av HTTP-standardslutpunkterna (WebHttpEndpoint eller WebScriptEndpoint), som du ser i följande exempel.

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

Namnet på återanropsfunktionen kan anges i en frågevariabel med namnet callback, i följande URL.

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

När den anropas skickar tjänsten ett svar som liknar följande.

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

Du kan också ange motringningsfunktionens namn genom att tillämpa JavascriptCallbackBehaviorAttribute på tjänstklassen, som visas i följande exempel.

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

För den tjänst som visades tidigare ser en begäran ut så här.

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

När den anropas svarar tjänsten med följande.

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

HTTP-statuskoder

JSONP-svar med andra HTTP-statuskoder än 200 innehåller en andra parameter med den numeriska representationen av HTTP-statuskoden, som du ser i följande exempel.

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

Valideringar

Följande valideringar utförs när JSONP är aktiverat:

  • WCF-infrastrukturen utlöser ett undantag om javascriptCallback är aktiverat, en frågesträngsparameter för motringning finns i begäran och svarsformatet är inställt på JSON.

  • Om begäran innehåller frågesträngsparametern för motringning men åtgärden inte är en HTTP GET ignoreras motringningsparametern.

  • Om motringningsnamnet är null eller en tom sträng formateras svaret inte som JSONP.

Se även