JSONP

Ukázka JSONP ukazuje, jak podporovat JSON s odsazením (JSONP) ve službách WCF REST. JSONP je konvence používaná k vyvolání skriptů mezi doménami generováním značek skriptů v aktuálním dokumentu. Výsledek se vrátí v zadané funkci zpětného volání. JSONP je založen na myšlence, že značky, jako <script src="http://..." > jsou například mohou vyhodnotit skripty z jakékoli domény, a skript načtený těmito značkami se vyhodnotí v oboru, ve kterém už můžou být definovány další funkce.

Demonstruje

Skriptování mezi doménami pomocí JSONP

Diskuse

Ukázka obsahuje webovou stránku, která dynamicky přidává blok skriptu po vykreslení stránky v prohlížeči. Tento blok skriptu volá službu WCF REST, která má jednu operaci, GetCustomer. Služba REST WCF vrátí název a adresu zákazníka zabalené v názvu funkce zpětného volání. Když služba REST WCF odpoví, vyvolá se funkce zpětného volání na webové stránce s daty zákazníka a funkce zpětného volání zobrazí data na webové stránce. Injektáž značky skriptu a spuštění funkce zpětného volání se automaticky zpracuje ovládacím prvku ASP.NET AJAX ScriptManager. Vzor použití je stejný jako u všech proxy ASP.NET AJAX s přidáním jednoho řádku pro povolení JSONP, jak je znázorněno v následujícím kódu:

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

Webová stránka může volat službu WCF REST, protože služba používá s nastaveným parametrem WebScriptEndpointcrossDomainScriptAccessEnabledtrue. Obě tyto konfigurace se provádějí v souboru Web.config v elementu <system.serviceModel> .

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

ScriptManager spravuje interakci se službou a skrývá složitost ruční implementace přístupu JSONP. Pokud crossDomainScriptAccessEnabled je nastavená true hodnota a formát odpovědi pro operaci je JSON, infrastruktura WCF zkontroluje identifikátor URI požadavku na parametr řetězce dotazu zpětného volání a zabalí odpověď JSON s hodnotou parametru řetězce dotazu zpětného volání. V ukázce webová stránka volá službu WCF REST s následujícím identifikátorem URI.

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

Protože parametr řetězce dotazu zpětného JsonPCallbackvolání má hodnotu , vrátí služba WCF odpověď JSONP zobrazenou v následujícím příkladu.

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

Tato odpověď JSONP zahrnuje zákaznická data naformátovaná jako JSON zabalená názvem funkce zpětného volání, kterou webová stránka požadovala. ScriptManager provede toto zpětné volání pomocí značky skriptu k provedení požadavku mezi doménami a pak předá výsledek obslužné rutině onSuccess, která byla předána operaci GetCustomer proxy ASP.NET AJAX.

Ukázka se skládá ze dvou ASP.NET webových aplikací: jedna obsahuje pouze službu WCF a druhá obsahuje webovou stránku .aspx, která službu volá. Při spuštění řešení bude Visual Studio hostovat dva weby na různých portech, což vytvoří prostředí, ve kterém služba a klient žijí v různých doménách.

Chcete-li spustit ukázku

  1. Otevřete řešení pro ukázku JSONP.

  2. stisknutím klávesy F5 spusťte http://localhost:26648/JSONPClientPage.aspx v prohlížeči.

  3. Všimněte si, že po načtení stránky se textové vstupy pro "Název" a "Adresa" naplní hodnotami. Tyto hodnoty byly zadány z volání služby WCF poté, co prohlížeč dokončil vykreslení stránky.