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 WebScriptEndpointcrossDomainScriptAccessEnabled
true
. 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 JsonPCallback
volá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
Otevřete řešení pro ukázku JSONP.
stisknutím klávesy F5 spusťte
http://localhost:26648/JSONPClientPage.aspx
v prohlížeči.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.