Condividi tramite


JSONP

L'esempio JSONP illustra come supportare JSON con Padding (JSONP) nei servizi REST WCF. JSONP è una convenzione usata per richiamare script tra domini generando tag di script nel documento corrente. Il risultato viene restituito in una funzione di callback specificata. JSONP si basa sull'idea che i tag come <script src="http://..." > possono valutare gli script da qualsiasi dominio e lo script recuperato da tali tag viene valutato all'interno di un ambito in cui altre funzioni possono essere già definite.

Dimostra

Scripting tra domini con JSONP.

Discussione

L'esempio include una pagina Web che aggiunge dinamicamente un blocco di script dopo il rendering della pagina nel browser. Questo blocco di script chiama un servizio REST WCF con una singola operazione, GetCustomer. Il servizio REST WCF restituisce il nome e l'indirizzo di un cliente incapsulati all'interno del nome di una funzione di callback. Quando il servizio REST WCF risponde, la funzione di callback nella pagina Web viene richiamata con i dati del cliente e la funzione di callback visualizza i dati nella pagina Web. L'inserimento del tag di script e l'esecuzione della funzione di callback viene gestita automaticamente dal controllo ScriptManager AJAX ASP.NET. Il modello di utilizzo è uguale a quello di tutti i proxy AJAX ASP.NET, con l'aggiunta di una riga per abilitare JSONP, come illustrato nel codice seguente:

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

La pagina Web può chiamare il servizio REST WCF perché il servizio sta usando WebScriptEndpoint impostando crossDomainScriptAccessEnabled su true. Entrambe queste configurazioni vengono eseguite nel file Web.config nell'elemento <system.serviceModel> .

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

ScriptManager gestisce l'interazione con il servizio e nasconde la complessità dell'implementazione manuale dell'accesso JSONP. Quando crossDomainScriptAccessEnabled è impostato su true e il formato di risposta per un'operazione è JSON, l'infrastruttura WCF controlla l'URI della richiesta per un parametro della stringa di query di callback ed esegue il wrapping della risposta JSON con il valore del parametro della stringa di query di callback. Nell'esempio la pagina Web chiama il servizio REST WCF con l'URI seguente.

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

Poiché il parametro della stringa di query di callback ha un valore , JsonPCallbackil servizio WCF restituisce una risposta JSONP illustrata nell'esempio seguente.

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

Questa risposta JSONP include i dati del cliente formattati come JSON, racchiusi con il nome della funzione di callback richiesto dalla pagina web. ScriptManager eseguirà questo callback usando un tag script per eseguire la richiesta tra domini e quindi passerà il risultato al gestore onSuccess passato all'operazione GetCustomer del proxy AJAX ASP.NET.

L'esempio è costituito da due applicazioni Web ASP.NET: una contiene solo un servizio WCF e un'altra contiene la pagina Web .aspx, che chiama il servizio. Quando si esegue la soluzione, Visual Studio ospiterà i due siti Web su porte diverse, che crea un ambiente in cui il servizio e il client risiedono in domini diversi.

Per eseguire l'esempio

  1. Aprire la soluzione per l'esempio JSONP.

  2. premere F5 per avviare http://localhost:26648/JSONPClientPage.aspx nel browser.

  3. Si noti che dopo il caricamento della pagina, gli input di testo per "Name" e "Address" vengono popolati da valori. Questi valori sono stati forniti da una chiamata al servizio WCF dopo che il browser ha completato il rendering della pagina.