2011-12-30 73 views
3

我正在使用WCF创建SOAP Web服务,其中包含预定义的XSD合约以及从该XSD自动生成的C#类型。如何避免使用XmlSerializerFormat进行WCF服务时的包装?

[ServiceContract] 
[XmlSerializerFormat] 
public interface IEBooking10 
{ 
     [OperationContract] 
     [XmlSerializerFormat] 
     OTA_CancelRS OTA_Cancel(OTA_CancelRQ rq); 
} 

OTA_CancelRQ & OTA_CancelRS是自动生成的类型,与相应的XML序列化属性。 参数匹配裹在OTA_Cancel和OTA_CancelResponse元素,像这样:

<OTA_Cancel> 
    <OTA_CancelRQ> ... </OTA_CancelRQ> 
</OTA_Cancel> 

<OTA_CancelResponse> 
    <OTA_CancelRS> ... </OTA_CancelRS> 
</OTA_CancelResponse> 

如何避免包装是WCF确实给OTA_Cancel操作的输入参数?

回答

2

这不是通过序列化来处理,而是通过消息定义来处理。目前你正在使用默认值,它表示序列化数据必须被包装,但操作元素。如果您想覆盖此行为,您必须使用message contracts。试试这样:

[MessageContract(IsWrapped = false)] 
public class OTA_CancelRQMessage 
{ 
    [MessageBodyMember] 
    public void OTA_CancelRQ { get; set; } 
} 

[MessageContract(IsWrapped = false)] 
public class OTA_CancelRSMessage 
{ 
    [MessageBodyMember] 
    public void OTA_CancelRS { get; set; } 
} 

[ServiceContract] 
[XmlSerializerFormat] 
public interface IEBooking10 
{ 
    [OperationContract] 
    [XmlSerializerFormat] 
    OTA_CancelRSMessage OTA_Cancel(OTA_CancelRQMessage rq); 
} 
+1

您确定邮件合同可以与XML序列化程序格式一起使用吗?我希望不得不使用数据合同格式,但我从未尝试过将这两种格式结合起来。 – 2011-12-30 15:01:55

+1

@编程英雄:是的,我相信他们可以。数据合同控制数据的序列化,但消息合约控制消息本身。消息内部的数据仍然通过选定的序列化方法进行序列化。 – 2011-12-30 16:52:24

+0

它的工作:)小修正,属性不能为空,更改“public void OTA_CancelRQ {get; set;}”为公众“OTA_CancelRQ OTA_CancelRQ {get; set;}”,也为响应。 – omittones 2011-12-30 23:56:09

相关问题