JSONPJSONP

In questo esempio viene illustrato come supportare JSONP (JSON with Padding) nei servizi WCF REST.This sample demonstrates how to support JSON with Padding (JSONP) in WCF REST services. JSONP è una convenzione usata per richiamare script tra domini mediante la generazione di tag script nel documento corrente.JSONP is a convention used to invoke cross-domain scripts by generating script tags in the current document. Il risultato viene restituito in una funzione di callback specificata.The result is returned in a specified callback function. JSONP si basa sul concetto che tag quali <script src="http://..." > grado di valutare script da ogni dominio e che lo script recuperato da tali tag venga valutato all'interno di un ambito in cui altre funzioni possono essere già definite.JSONP is based on the idea that tags such as <script src="http://..." > can evaluate scripts from any domain and the script retrieved by those tags is evaluated within a scope in which other functions may already be defined.

DimostrazioneDemonstrates

Generazione di script tra domini con JSONP.Cross-domain scripting with JSONP.

DiscussioneDiscussion

Nell'esempio è inclusa una pagina Web che aggiunge dinamicamente un blocco di script dopo il rendering della pagina nel browser.The sample includes a Web page that dynamically adds a script block after the page has been rendered in the browser. Questo blocco di script chiama un servizio WCF REST che dispone di una sola operazione, ovvero GetCustomer.This script block calls a WCF REST service that has a single operation, GetCustomer. Il servizio WCF REST restituisce il nome e l'indirizzo di un cliente incapsulati in un nome di funzione di callback.The WCF REST service returns a customer’s name and address wrapped in a callback function name. Quando il servizio WCF REST 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.When the WCF REST service responds, the callback function on the Web page is invoked with the customer data and the callback function displays the data on the Web page. L'inserimento del tag script e l'esecuzione della funzione di callback vengono gestite automaticamente dal controllo ScriptManager di AJAX ASP.NET.The injection of the script tag and the execution of the callback function is automatically handled by the ASP.NET AJAX ScriptManager control. Il modello di utilizzo è lo stesso di tutti i proxy AJAX ASP.NET, con l'aggiunta di una riga per l'abilitazione di JSONP, come illustrato nel codice seguente:The usage pattern is the same as with all ASP.NET AJAX proxies, with the addition of one line to enable JSONP, as shown in the following code:

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

La pagina Web può chiamare il servizio WCF REST perché il servizio sta usando WebScriptEndpoint con crossDomainScriptAccessEnabled impostato su true.The Web page can call the WCF REST service because the service is using the WebScriptEndpoint with crossDomainScriptAccessEnabled set to true. Entrambe queste configurazioni vengono eseguite nel file Web. config sotto il <System. ServiceModel > elemento.Both of these configurations are done in the Web.config file under the <system.serviceModel> element.

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

ScriptManager gestisce l'interazione con il servizio non rivelando la complessità dell'implementazione manuale dell'accesso JSONP.ScriptManager manages the interaction with the service and hides away the complexity of manually implementing JSONP access. Quando si crossDomainScriptAccessEnabled è impostata su true e il formato della risposta per un'operazione è JSON, l'infrastruttura WCF controlla l'URI della richiesta per un parametro di stringa di query di callback ed esegue il wrapping della risposta JSON con il valore della stringa di query di callback parametro.When crossDomainScriptAccessEnabled is set to true and the response format for an operation is JSON, the WCF infrastructure inspects the URI of the request for a callback query string parameter and wraps the JSON response with the value of the callback query string parameter. Nell'esempio la pagina Web chiama il servizio WCF REST con l'URI seguente:In the sample, the Web page calls the WCF REST service with the following URI.

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

Poiché il parametro della stringa di query di callback dispone di un valore JsonPCallback, il servizio WCF restituisce la risposta JSONP illustrata nell'esempio seguente.Because the callback query string parameter has a value of JsonPCallback, the WCF service returns a JSONP response shown in the following example.

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

Questa risposta JSONP include i dati del cliente formattati come JSON, di cui è stato eseguito il wrapping con il nome della funzione di callback richiesta dalla pagina Web.This JSONP response includes the customer data formatted as JSON, wrapped with the callback function name that the Web page requested. ScriptManager eseguirà questo callback usando un tag script per portare a termine la richiesta tra domini, quindi passerà il risultato al gestore onSuccess passato all'operazione GetCustomer del proxy AJAX ASP.NET.ScriptManager will execute this callback using a script tag to accomplish the cross-domain request, and then pass the result to the onSuccess handler that was passed to the GetCustomer operation of the ASP.NET AJAX proxy.

L'esempio è costituito da due applicazioni web ASP.NET: una contiene solo un servizio WCF, mentre un altro contiene la pagina Web. aspx, che chiama il servizio.The sample consists of two ASP.NET web applications: one contains just a WCF service, and another one contains the .aspx webpage, which calls the service. Quando la soluzione viene eseguita, in Visual Studio 2012Visual Studio 2012 verranno ospitati i due siti web su porte diverse, creando un ambiente in cui il servizio e il client sono presenti in domini diversi.When running the solution, Visual Studio 2012Visual Studio 2012 will host the two websites on different ports, which creates an environment where the service and client live on different domains.

Importante

È possibile che gli esempi siano già installati nel computer.The samples may already be installed on your machine. Verificare la directory seguente (impostazione predefinita) prima di continuare.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Se questa directory non esiste, andare al Windows Communication Foundation (WCF) e gli esempi di Windows Workflow Foundation (WF) per .NET Framework 4 per scaricare tutti i Windows Communication Foundation (WCF) e WFWF esempi.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF) and WFWF samples. Questo esempio si trova nella directory seguente.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WCF\Basic\AJAX\JSONP

Per eseguire l'esempioTo run the sample

  1. Aprire la soluzione per l'esempio relativo a JSONP.Open the solution for the JSONP Sample.

  2. Premere F5 per avviare http://localhost:26648/JSONPClientPage.aspx nel browser.Press F5 to launch http://localhost:26648/JSONPClientPage.aspx in the browser.

  3. Si noti che dopo il caricamento della pagina, gli input di testo per "Name" e "Address" vengono popolati dai valori.Notice that after the page loads, the text inputs for "Name" and "Address" are populated by values. Questi valori vengono forniti da una chiamata al servizio WCF termine del processo di rendering della pagina del browser.These values were supplied from a call to the WCF service after the browser finished rendering the page.