【问题标题】:How to avoid wrapping when using XmlSerializerFormat for WCF service?将 XmlSerializerFormat 用于 WCF 服务时如何避免换行?
【发布时间】:2012-01-30 14:36:23
【问题描述】:

我正在使用 WCF 创建一个 SOAP Web 服务,它具有预定义的 XSD 协定,以及从该 XSD 自动生成的 C# 类型。

 [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 操作的输入参数进行包装?

【问题讨论】:

    标签: c# .net wcf serialization


    【解决方案1】:

    这不是由序列化而是由消息定义处理的。目前您正在使用默认值,它表示必须包装序列化数据,但操作元素。如果你想覆盖这个行为,你必须使用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);
    }
    

    【讨论】:

    • 您确定消息契约可以与 XML 序列化器格式一起使用吗?我希望必须使用 Data Contract 格式,但我从未尝试将两者结合起来。
    • @Programming Hero:是的,我相信他们可以。数据契约控制数据的序列化,但消息契约控制消息本身。消息中的数据仍然通过选择的序列化方式进行序列化。
    • 它工作了 :) 小幅修正,属性不能为空,将“public void OTA_CancelRQ { get; set; }”更改为 public “OTA_CancelRQ OTA_CancelRQ { get; set; }”并用于响应。
    猜你喜欢
    • 2017-10-10
    • 2011-05-31
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多