JSONP

В примере JSONP показано, как поддерживать JSON с заполнением (JSONP) в службах REST WCF. JSONP является правилом, используемым для вызова скриптов между доменами путем создания тегов скриптов в текущем документе. Результат возвращается в заданной функции обратного вызова. JSONP основан на идее, что теги, такие как <script src="http://..." > могут оценивать скрипты из любого домена, и скрипт, полученный этими тегами, оценивается в область, в котором уже могут быть определены другие функции.

Что демонстрирует

Междоменная работа со скриптами с JSONP.

Обсуждение

В образец входит веб-страница, которая динамически добавляет блок скрипта после отображения страницы в веб-браузере. В этом блоке скрипта вызывается служба WCF REST, содержащая одну операцию GetCustomer. Служба REST WCF возвращает имя и адрес клиента, завернутые в имя функции обратного вызова. Когда служба WCF REST отправляет ответ, вызывается функция обратного вызова на веб-странице с данными о клиенте, и функция обратного вызова выводит эти данные на веб-странице. Вставка тега скрипта и выполнение функции обратного вызова автоматически обрабатываются элементом управления ASP.NET AJAX ScriptManager. Схема использования та же, что и для всех прокси ASP.NET AJAX, плюс добавляется строка для включения JSONP, как показано в следующем коде.

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

Веб-страница может вызывать службу WCF REST, поскольку эта служба использует объект WebScriptEndpoint, где свойство crossDomainScriptAccessEnabled установлено в значении true. Обе эти конфигурации выполняются в файле web.config в элементе <system.serviceModel> .

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

ScriptManager управляет взаимодействием со службой и устраняет сложности реализации доступа JSONP вручную. Если crossDomainScriptAccessEnabled задано true значение и формат ответа для операции — JSON, инфраструктура WCF проверяет URI запроса для параметра строки запроса обратного вызова и упаковывает ответ JSON со значением параметра строки запроса обратного вызова. В образце веб-страница вызывает службу WCF REST со следующим URI.

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

Поскольку строковый параметр запроса обратного вызова имеет значение JsonPCallback, служба WCF возвращает ответ JSONP, показанный в следующем примере.

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

Этот ответ JSONP содержит данные о клиенте в формате JSON, заключенные в имя функции обратного вызова, запрошенной веб-страницей. ScriptManager будет выполнять этот обратный вызов, используя тег скрипта для междоменного запроса, а затем передаст результат в обработчик onSuccess, который передан в операцию GetCustomer прокси ASP.NET AJAX.

Пример состоит из двух веб-приложений ASP.NET: один содержит только службу WCF, а другой — веб-страницу .aspx, которая вызывает службу. При запуске решения Visual Studio будет размещать два веб-сайта на разных портах, что создает среду, в которой служба и клиент живут в разных доменах.

Запуск образца

  1. Откройте решение для образца JSONP.

  2. Нажмите клавишу F5 , чтобы запустить http://localhost:26648/JSONPClientPage.aspx в браузере.

  3. Обратите внимание, что после загрузки страницы текстовые входные данные для "Имя" и "Адрес" заполняются значениями. Эти значения были предоставлены из вызова службы WCF после завершения отрисовки страницы в браузере.