如何在WCF OperationContracts中正确使用MessageContract?

时间:2011-06-09 11:34:52

标签: wcf

有人可以指出(或在这里,如果可能的话)回答我的材料/参考,该材料/参考描述了如何在WCF操作中正确使用MessageContrac t。我看过this文件。

我想知道: 1)使用MessageContract作为操作合同的返回值时有哪些限制? 2)如果用MessageContract装饰的类具有返回用XmlRoot装饰的类的对象的属性,该怎么办? 3)如果MessageContract将包含数组或集合,是否有任何限制或考虑因素?

2 个答案:

答案 0 :(得分:3)

  1. 限制是,一旦您使用MessageContract进行请求描述,您也必须将其用于响应,反之亦然。唯一的例外是返回void或不接受任何参数的操作。
  2. 默认情况下,WCF使用DataContractSerializer,但您可以通过使用XmlSerializer属性标记合同,服务或操作将其切换为XmlSerailazerFormat。在这种情况下,序列化将忽略DataContract / DataMember属性并开始使用常见的Xml序列化属性(包括XmlRoot)。最重要的是MessageContract与使用的序列化程序无关 - 它可以与DataContract和Xml序列化一起使用。
  3. 我会传递嵌套在其他元素中的集合。我不确定如何将unwrapped集合直接传递给soap:Body,因为它应该表示为多个body元素,由MessageContract单独处理 - 每个元素都标有MessageBodyMember属性。

答案 1 :(得分:1)

MessageContract属性启用/要求您指定操作的整个消息的格式,对序列化/反序列化消息的方式进行细粒度控制,而不是控制是否包含单个字段的DataContract / DataMember属性在序列化中。

处理可序列化类时,System.Xml.XmlSerializer类使用XmlRoot属性; WCF使用不使用此属性的DataContractSerializer。

此问题中的更多信息:Why does the XmlRoot attribute gets ignored in WCF and how to overcome this