WCF: используйте JSON для кодирования тела сообщения SOAP - PullRequest
0 голосов
/ 18 мая 2009

У нас есть SOAP-реализации наших сервисов, и до сих пор у нас был некоторый устаревший код, который упаковывал наши аргументы и возвращался в другой объект, чтобы обойти некоторые сериализации / обобщения для методов RPC.

После оптимизации мы реализовали этот класс так, чтобы он сериализовал Json (DataContractJsonSerializer) и GZipped наши сложные параметры запроса и объекты ответа.

Теперь я хочу поместить этот материал в стек WCF. Что я действительно хочу, так это возможность кодировать тело сообщения как GZipped Json в стандартном сервисе SOAP. Нам нужна поддержка транзакций, безопасность и т. Д., Поэтому мы должны иметь возможность поддерживать стандартные привязки.

Мне удалось реализовать сериализацию «Поведение операций для Json», чтобы инфо-набор сообщений содержал json-совместимый XML. Затем я хотел добавить MessageEncoder, чтобы превратить xml в json в теле сообщения. Здесь у меня есть проблемы. Я не могу сериализовать все сообщение, так как у нас все еще есть стандартные мыльные заголовки и т. Д., А s: body все еще содержит корневой объект Request или Response до json-совместимого xml. Я полагаю, что могу использовать JsonReaderWriterFactory, но не знаю, как применить к корректирующей части сообщения.

Я знаю, что смогу сделать GZIP позже, если смогу просто прочитать и написать этот раздел Json.

Есть идеи? Пит

OK. Так что некоторые уточнения.

Мой сервис выглядит так

[ServiceContract]
public interface IMyService {
  [OperationContract]
  Person SavePerson(Person personToSave);

  [OperationContract]
  Person GetPersons();
}

и вывод метода GetPersons () будет выглядеть примерно так:

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
  <s:Header>
    <a:Action s:mustUnderstand="1">http://www.petegoo.com/wcf/MyService/IMyService/GetPersonsResponse</a:Action>
    <a:RelatesTo>urn:uuid:a18ccf1c-0793-4240-ba6f-9e86b6f2fdf6</a:RelatesTo>
  </s:Header>
  <s:Body>[{"DateOfBirth":"\/Date(286801200000+1300)\/","FirstName":"Foo","Id":1,"LastName":"Bar"},{"DateOfBirth":"\/Date(333720000000+1200)\/","FirstName":"Foo","Id":1,"LastName":"Bar"}]</s:Body>
</s:Envelope>

Примечание. Вышеприведенное было специальным, поэтому не может быть синтаксически или семантически правильным.

Ответы [ 2 ]

0 голосов
/ 09 мая 2013

Ааа !! Просто пойми, сколько лет. Оставим здесь на случай, если это сработает для кого-либо еще.

Я сам новичок во всем этом, но, как совет, вы пытались заглянуть в MessageInspectors? Вы можете добавить их в clientRuntime и dispatchRuntime, чтобы «играть» с сообщениями SOAP до и после их отправки WCF.

Реализуя IDispatchMessageInspector и / или IClientMessageInspector, вы могли бы получить вызов перед отправкой сообщения, прочитать текущее мыльное сообщение xml, изменить содержимое элемента body, чтобы оно содержало ваш сжатый контент (возможно, добавив его новый дочерний узел), а затем пересоберите сообщение и передайте его обратно в WCF для отправки. На приемном конце вы снова получаете сообщение в AfterReceiveRequest и полностью изменяете процесс.

Не знаю, сработает ли это для вас, но надеюсь, что это поможет. W

0 голосов
/ 18 мая 2009

Насколько я понимаю, вам нравится вставлять JSON в XML-инфо-набор в SOAP? Было бы проще написать пример запроса и ответа, который вы хотите получить.

Я не вижу веской причины для сосуществования инфо-набора JSON с инфо-набором XML. Однако вы можете вернуть данные JSON в виде строкового значения элемента / атрибута XML в SOAP.

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