JSONP
В этом образце показано, как обеспечить поддержку JSONP(JSON with Padding) в службах WCF REST. JSONP является правилом, используемым для вызова скриптов между доменами путем создания тегов сценариев в текущем документе. Результат возвращается в заданной функции обратного вызова. JSONP основан на идее, что теги, такие как <script src=”http://...”>, могут выполнять скрипты из любого домена, причем скрипт, полученный этими тегами, выполняется в области, где уже могут быть определены другие функции.
Демонстрации
Междоменная работа со скриптами с JSONP.
Обсуждение
В образец входит веб-страница, которая динамически добавляет блок скрипта после отображения страницы в веб-обозревателе. В этом блоке скрипта вызывается служба WCF REST, содержащая одну операцию GetCustomer
. Служба WCF REST возвращает имя и адрес клиента, заключенные в оболочку функции обратного вызова. Когда служба 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.
https://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 2010 размещает два веб-сайта по различным портам, и создается среда, где служба и клиент работают в различных доменах.
![]() |
---|
Образцы уже могут быть установлены на компьютере. Перед продолжением проверьте следующий каталог (по умолчанию).
<диск_установки>:\WF_WCF_Samples
Если этот каталог не существует, перейдите на страницу Образцы Windows Communication Foundation (WCF) и Windows Workflow Foundation (WF) для .NET Framework 4, чтобы загрузить все образцы Windows Communication Foundation (WCF) и WF. Этот образец расположен в следующем каталоге.
<диск_установки>:\WF_WCF_Samples\WCF\Basic\AJAX\JSONP
|
Выполнение образца
Откройте решение для образца JSONP.
Нажмите клавишу F5, чтобы запустить https://localhost:26648/JSONPClientPage.aspx в веб-обозревателе.
Заметьте, что после загрузки страницы поля ввода для имени и адреса заполняются значениями. Эти значения получены из вызова службы WCF после того, как веб-обозреватель завершил визуализацию страницы.