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ą crossDomainScriptAccessEnabledtrue. 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

  1. Otwórz rozwiązanie dla przykładu JSONP.

  2. naciśnij klawisz F5 , aby uruchomić http://localhost:26648/JSONPClientPage.aspx w przeglądarce.

  3. 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ę.