JSONP
W przykładzie JSONP pokazano, jak obsługiwać kod JSON z dopełnianiem (JSONP) w usługach REST WCF. JSONP to konwencja używana do wywoływania skryptów między domenami przez generowanie tagów skryptów w bieżącym dokumencie. Wynik jest zwracany w określonej funkcji wywołania zwrotnego. Kod JSONP opiera się na założeniu, że tagi, takie jak <script src="http://..." >
mogą oceniać skrypty z dowolnej domeny, a skrypt pobrany przez te tagi jest oceniany w zakresie, w którym inne funkcje mogą być już zdefiniowane.
Demonstracje
Wykonywanie skryptów między domenami przy użyciu formatu JSONP.
Dyskusja
Przykład zawiera stronę sieci Web, która dynamicznie dodaje blok skryptu po renderowaniu strony w przeglądarce. Ten blok skryptu wywołuje usługę REST WCF, która ma jedną operację. GetCustomer
Usługa REST WCF zwraca nazwę i adres klienta opakowany w nazwę funkcji wywołania zwrotnego. Gdy usługa REST WCF odpowiada, funkcja wywołania zwrotnego na stronie sieci Web jest wywoływana z danymi klienta, a funkcja wywołania zwrotnego wyświetla dane na stronie sieci Web. Wstrzyknięcie tagu skryptu i wykonanie funkcji wywołania zwrotnego jest automatycznie obsługiwane przez kontrolkę ASP.NET AJAX ScriptManager. Wzorzec użycia jest taki sam jak w przypadku wszystkich serwerów proxy AJAX ASP.NET z dodaniu jednego wiersza w celu włączenia formatu JSONP, jak pokazano w poniższym kodzie:
var proxy = new JsonpAjaxService.CustomerService();
proxy.set_enableJsonp(true);
proxy.GetCustomer(onSuccess, onFail, null);
Strona sieci Web może wywołać usługę REST WCF, ponieważ usługa używa elementu z ustawioną WebScriptEndpoint wartością crossDomainScriptAccessEnabled
true
. Obie te konfiguracje są wykonywane w pliku Web.config w elemecie <system.serviceModel> .
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
<standardEndpoints>
<webScriptEndpoint>
<standardEndpoint name="" crossDomainScriptAccessEnabled="true"/>
</webScriptEndpoint>
</standardEndpoints>
</system.serviceModel>
ScriptManager zarządza interakcją z usługą i ukrywa złożoność ręcznego implementowania dostępu JSONP. Gdy crossDomainScriptAccessEnabled
jest ustawiona true
wartość i format odpowiedzi dla operacji to JSON, infrastruktura WCF sprawdza identyfikator URI żądania dla parametru ciągu zapytania wywołania zwrotnego i opakowuje odpowiedź JSON z wartością parametru ciągu zapytania wywołania zwrotnego. W przykładzie strona sieci Web wywołuje usługę REST WCF przy użyciu następującego identyfikatora URI.
http://localhost:33695/CustomerService/GetCustomer?callback=Sys._json0
Ponieważ parametr ciągu zapytania wywołania zwrotnego ma wartość JsonPCallback
, usługa WCF zwraca odpowiedź JSONP pokazaną w poniższym przykładzie.
Sys._json0({"__type":"Customer:#Microsoft.Samples.Jsonp","Address":"1 Example Way","Name":"Bob"});
Ta odpowiedź JSONP zawiera dane klienta sformatowane jako JSON, opakowane nazwą funkcji wywołania zwrotnego żądaną przez stronę sieci Web. ScriptManager wykona to wywołanie zwrotne przy użyciu tagu skryptu w celu wykonania żądania między domenami, a następnie przekaże wynik do procedury obsługi onSuccess, która została przekazana do operacji GetCustomer serwera proxy ASP.NET AJAX.
Przykład składa się z dwóch ASP.NET aplikacji internetowych: jedna zawiera tylko usługę WCF, a druga zawiera stronę internetową .aspx, która wywołuje usługę. Podczas uruchamiania rozwiązania program Visual Studio będzie hostować dwie witryny internetowe na różnych portach, co tworzy środowisko, w którym usługa i klient mieszkają w różnych domenach.
Aby uruchomić przykład
Otwórz rozwiązanie dla przykładu JSONP.
naciśnij klawisz F5 , aby uruchomić
http://localhost:26648/JSONPClientPage.aspx
w przeglądarce.Zwróć uwagę, że po załadowaniu strony dane wejściowe tekstu dla wartości "Name" i "Address" są wypełniane wartościami. Te wartości zostały dostarczone z wywołania usługi WCF po zakończeniu renderowania strony przez przeglądarkę.