Поделиться через


Использование JSONP

JSONP — это механизм, который обеспечивает поддержку межсайтового скриптинга в веб-браузерах. JSONP разработан вокруг возможности веб-браузеров загружать скрипты с сайта, отличного от того, из которого был получен текущий загруженный документ. Механизм работает за счёт добавления к JSON полезной нагрузке имени функции обратного вызова, определяемой пользователем, как показано в следующем примере.

callback({"a" = \\"b\\"});

В предыдущем примере полезные данные {"a" = \\"b\\"}JSON упаковываются в вызов callbackфункции. Функция обратного вызова должна быть уже определена на текущей веб-странице. Тип контента ответа JSONP — application/javascript.

JSONP не включен автоматически. Чтобы включить его, задайте атрибут javascriptCallbackEnabled значением true на одной из стандартных конечных точек HTTP (WebHttpEndpoint или WebScriptEndpoint), как показано в следующем примере.

<system.serviceModel>
  <standardEndpoints>
    <webHttpEndpoint>
      <standardEndpoint name="" javascriptCallbackEnabled="true"/>
    </webHttpEndpoint>
  </standardEndpoints>
</system.serviceModel>

Имя функции обратного вызова можно указать в переменной запроса с именем обратного вызова, как показано в следующем URL-адресе.

http://baseaddress/Service/RestService?callback=functionName

При вызове служба отправляет ответ, как показано ниже.

functionName({"root":"Something"});

Можно также указать имя функции обратного вызова, применив JavascriptCallbackBehaviorAttribute его к классу службы, как показано в следующем примере.

[ServiceContract]
[JavascriptCallbackBehavior(ParameterName = "$callback")]
public class Service1
{
    [OperationContract]
    [WebGet(ResponseFormat=WebMessageFormat.Json)]
    public string GetData()
    {
    }
}

Для службы, показанной ранее, запрос выглядит следующим образом.

http://baseaddress/Service/RestService?$callback=anotherFunction

При вызове служба отвечает следующим образом.

anotherFunction ({"root":"Something"});

Коды состояния HTTP

Ответы JSONP с кодами состояния HTTP, отличные от 200, включают второй параметр с числовым представлением кода состояния HTTP, как показано в следующем примере.

anotherFunction ({"root":"Something"}, 201);

Проверки

При включении JSONP выполняются следующие проверки:

  • Инфраструктура WCF создает исключение, если включен javascriptCallback, в запросе указан параметр обратного вызова, а формат ответа установлен на JSON.

  • Если запрос содержит параметр строки запроса обратного вызова, но операция не является HTTP GET, параметр обратного вызова игнорируется.

  • Если имя обратного вызова является null или пустой строкой, ответ не форматируется как JSONP.

См. также