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 будет размещать два веб-сайта на разных портах, что создает среду, в которой служба и клиент живут в разных доменах.
Запуск образца
Откройте решение для образца JSONP.
Нажмите клавишу F5 , чтобы запустить
http://localhost:26648/JSONPClientPage.aspx
в браузере.Обратите внимание, что после загрузки страницы текстовые входные данные для "Имя" и "Адрес" заполняются значениями. Эти значения были предоставлены из вызова службы WCF после завершения отрисовки страницы в браузере.