Применение [WebInvoke (ResponseFormat = WebMessageFormat.Json)] в файле конфигурации - PullRequest
6 голосов
/ 26 мая 2010

Я пишу то, что я называю веб-службой WCF POJ (Plain Old JSON) - той, которая принимает и испускает стандартный JSON без всякой хрени, которую ASP.NET Ajax любит добавлять в нее.

Похоже, что для этого есть три шага:

  1. Измените "enableWebScript" на "webHttp" в теге конечной точки
  2. Украсить метод с помощью [WebInvoke (ResponseFormat = WebMessageFormat.Json)]
  3. Добавление заклинания [AspNetCompatibilityRequirements (RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] к контракту на обслуживание

У меня все нормально, я могу пройти, и мне возвращают хороший простой JSON.

Если я удаляю атрибут WebInvoke, то вместо этого мне возвращается XML, поэтому он, безусловно, делает то, что должен делать. Но мне кажется странным, что опция указания вывода JSON появляется здесь, а не в файле конфигурации. Скажем, я тоже хотел представить свой метод как конечную точку XML - как бы я это сделал? В настоящее время единственный способ, которым я могу видеть, - это иметь второй метод, который делает то же самое, но не указывает WebMethodFormat.Json. Затем промыть и повторить для каждого метода в моем сервисе? Тьфу.

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

Есть ли лучший способ сделать то, что я хочу сделать? Или мы застряли с этим неловким атрибутом? Или я недостаточно глубоко понимаю WCF?

1 Ответ

6 голосов
/ 26 мая 2010

Я еще не полностью протестировал это, НО, я взглянул на WebMessageFormat в отражателе и где он использовался в коде.

Существует атрибут элемента webHttp, называемый defaultOutgoingResponseFormat, для которого можно установить значение "Json" или "Xml".

    <behaviors>
      <endpointBehaviors>
        <behavior name="ServicesJSONEndpointBehavior">
          <webHttp defaultOutgoingResponseFormat="Json"/>
        </behavior>
</behaviors>

Я столкнулся с той же проблемой и обычно искал обходные пути после поиска в Интернете без особой информации.

Я сделаю снимок с несколькими настроенными конечными точками поведения и сообщу.

ОБНОВЛЕНИЕ 6/5/2011

К вашему сведению - я отказался от ванильного WCF со всеми его сценариями, такими как этот, который должен быть простой , в пользу ServiceStack (http://servicestack.net/). Если вы хотите собрать стандартный REST-стиль / документ-ориентированный сервис по HTTP, который готов из коробки поддерживает JSON / XML / CSV (и в будущих буферах протокола) и который позволяет вам собрать чистый MVC стиль маршрутов с легкостью, дать ServiceStack жесткий взгляд. Есть ряд вещей, которые ServiceStack будет обрабатывать довольно легко и чисто, которые всегда оказываются главной PITA из-за некоторых проблем с конфигурацией или схожих в стандартном WCF. ServiceStack использует свой собственный сериализатор JSON, который в качестве дополнительного бонуса превосходит DataContractJsonSerializer и JSON.NET, как упоминает Демис ниже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...