WCF без конфигурации, использующий фабрики и JSONP - PullRequest
1 голос
/ 28 февраля 2010

Я использую WebServiceHostFactory в своих службах WCF, чтобы избежать необходимости создавать краткую конфигурацию привязки в web.config.

Однако я бы хотел представить сервисы как XML / JSON и JSONP.

Чтение: http://jasonkelly.net/archive/2009/02/24/using-jquery-amp-jsonp-for-cross-domain-ajax-with-wcf-services.aspx

Не похоже, что я могу расширить WCF для добавления JSONP, не прибегая к горам пользовательских настроек связывания.

Итак, для тех, кто это сделал, возможно ли иметь спокойный сервис WCF, который отвечает в XML / JSON / JSONP в зависимости от UriTemplate, не прибегая к куче проводов конфигурации?

Ответы [ 3 ]

3 голосов
/ 28 февраля 2010
  1. JSONP доступен только через пользовательскую привязку pre-NET4. В .NET 4 они добавили новое свойство в WebHttpBinding под названием crossDomainScriptAccessEnabled, которое добавляет поддержку JSONP. Смотри http://www.bendewey.com/blog/index.php/186/using-jsonp-with-wcf-and-jquery

  2. Что касается принятия XML и JSON в одном сервисе с использованием UriTemplates, я описываю два метода в этом представлении http://www.bendewey.com/blog/index.php/176/alt-net-rest-presentation (полный исходный код также доступен здесь).

    1. Используйте два метода ввода и обработайте вызов внутренним методом. См. Образец 1.

    2. Используйте контракт на входящее / исходящее сообщение для всех и направьте сервисный вызов вручную. Смотрите образец 2.

Образец 1

    [OperationContract]
    [WebGet(UriTemplate = "/")]
    Years GetYears();

    [OperationContract]
    [WebGet(UriTemplate = "/json/", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
    Years GetJsonYears();

    Years GetYearsInternal();

Образец 2

    [OperationContract]
    [WebGet(UriTemplate = "*")]
    Message Get();
2 голосов
/ 28 февраля 2010

Я думаю, вы сможете сделать это довольно легко, используя в контракте на обслуживание разные методы, которые имеют разные форматы ответов:

interface IYourService
{
     [OperationContract]
     [WebGet(UriTemplate="/YourMethod/XML", ResponseFormat=WebMessageFormat.Xml)]
     SomeReturnObject YourMethodAsXml(.....);

     [OperationContract]
     [WebGet(UriTemplate="/YourMethod/JSON", ResponseFormat=WebMessageFormat.Json)]
     SomeReturnObject YourMethodAsJson(.....);
}

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

Я бы сказал, что для этого не нужно никакой большой войны за конфигурацию, и это решило бы как минимум два из трех ваших пунктов (XML и JSON).

JSONP изначально не поддерживается в WCF, но, как показано в статье, на которую вы ссылались, вы можете довольно легко добавить это поведение. Однако для включения этого расширения WCF требуется некоторая настройка конфигурации. Но, насколько я понимаю, это должно быть единовременно на вашем сервере.

Если вы действительно не можете справиться с этой настройкой конфигурации, вы, конечно, можете получить пользовательский WebServiceHostFactoryWithJSONPSupport из WebServiceHostFactory, используемый для служб WCF REST, и добавить необходимые расширения (например, поведение служб и т. Д.) В Ваш хозяин фабрики. Класс не запечатан, так что это должно быть достаточно просто (по крайней мере, теоретически :-)).

0 голосов
/ 22 мая 2010

только для того, чтобы вы знали, что службы данных WCF (ранее Astoria) поддерживают прямые OData и JSON.

не нужно никакого кодирования. В VS 2010 вы просто:

  1. Создание модели сущности ADO.NET
  2. Создание новой службы данных WCF

При этом автоматически создается веб-служба с поддержкой REST, которая генерирует JSON или Atom на основе предоставленной конфигурации. По умолчанию используется ATOM. Чтобы получить данные в формате JSON, вы должны указать «application / json» в заголовке вашего клиента «Accept».

Чтобы сделать JSONP, требуется некоторая работа, проверьте эту ссылку: Ссылка 1

...