Как правильно использовать MessageContract в WCF OperationContracts? - PullRequest
1 голос
/ 09 июня 2011

Может ли кто-нибудь указать (или ответить здесь, если возможно) на материал / ссылку, в которых описано, как правильно использовать MessageContrac t в операциях WCF. Я прочитал этот документ.

Я хотел бы знать: 1) Какие ограничения существуют при использовании MessageContract в качестве возвращаемого значения контракта на эксплуатацию? 2) Что, если у класса, украшенного MessageContract, есть свойство, которое возвращает объект класса, украшенного XmlRoot? 3) Существуют ли какие-либо ограничения или соображения, если MessageContract будет содержать массивы или коллекции?

Ответы [ 2 ]

3 голосов
/ 09 июня 2011
  1. Ограничение заключается в том, что если вы используете MessageContract для описания запроса, вы должны использовать его и для ответа, и наоборот.Единственным исключением являются операции, возвращающие void или не принимающие параметры.
  2. WCF по умолчанию использует DataContractSerializer, но вы можете переключить его на XmlSerializer, пометив контракт, службу или операцию с атрибутом XmlSerailazerFormat.В этом случае сериализация будет игнорировать атрибуты DataContract / DataMember и начнет использовать общие атрибуты сериализации Xml (включая XmlRoot).Самое главное, что MessageContract не относится к используемому сериализатору - его можно использовать как с сериализацией DataContract, так и с сериализацией Xml.
  3. Я бы передал коллекцию, вложенную в другой элемент.Я не уверен, как, если возможно передать распакованную коллекцию непосредственно в мыло: Body, потому что она должна быть представлена ​​в виде нескольких элементов body, которые обрабатываются отдельно MessageContract - каждый отмечен атрибутом MessageBodyMember.
1 голос
/ 09 июня 2011

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

Атрибут XmlRoot используется классом System.Xml.XmlSerializer при обработке сериализуемых классов; WCF использует DataContractSerializer, который не использует этот атрибут.

Дополнительная информация в этом вопросе: Почему атрибут XmlRoot игнорируется в WCF и как его преодолеть

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