WCF:MessageContract、DataContract ... 感到困惑?

Posted

技术标签:

【中文标题】WCF:MessageContract、DataContract ... 感到困惑?【英文标题】:WCF: MessageContract, DataContract ... Confused? 【发布时间】:2010-10-14 23:46:02 【问题描述】:

我正在编写我的第一个 WCF 服务。我决定首先将服务编写为一个 DLL,然后再将 WCF 的东西放在上面,这就是我现在所处的位置。

架构师建议我应该坚持我已经完成的消息对象的特定格式。但是,我在消息对象中使用了接口、复杂类型及其列表。我要添加属性了,我有点困惑。

这是我的代码的展示示例。

[ServiceContract]
public interface MyServiceContract

     [OperationContract]
     MyMethodResponseMessage MyMethod(MyMethodRequestMessage request);


public class MyService : MyServiceContract

    public MyMethodResponseMessage MyMethod(MyMethodRequestMessage request)
    
        //Do things
    


//Messages
[MessageContract]
public class MyMethodResponseMessage 

    [MessageBodyMember]
    public MyMethodResponse Body  get; set; 


[DataContract]
public class MyMethodResponse

    [DataMember]
    public IMyComplexTypeItem  get; set; 

    [DataMember]
    public List<IMyComplexType> Items  get; set; 

    [DataMember]
    public bool Success  get; set; 


//DTO    
public interface IMyComplexType 

    [DataMember]
    string Identity  get; set; 


[DataContract]
public class MyComplexType1 : IMyComplexType

     [DataMember]
     public virtual string Identity

谁能评论 MessageContract、DataContract、DataMember 和 Serializable 等使用的正确性?有任何指示或明显的错误吗?

还有哪个序列化器最好用?以及确保我从中获得格式良好的 XML 以便其他客户可以轻松使用我的服务的最佳策略是什么?

【问题讨论】:

【参考方案1】:

重新请求/响应 - [DataContract] 也可以。消息合同的优点之一是您可以对成员设置隐私,但在许多情况下这不是必需的。在这种情况下,我更喜欢让合同尽可能简单,就像数据合同一样。

Re which serializer - 这在很大程度上是配置的一个因素。默认情况下通过 http,例如,它将是 DataContractSerializer

不过,我不确定IMyComplexType 的列表是否能正常工作。您可以尝试,但通常它需要具体类型。请注意,对于基类,您可以使用 [KnownType] 指定允许的子类型。

请注意,与XmlSerializer 不同,集合成员不需要设置器 - 尽管您可能需要添加OnDeserializing 回调方法来初始化列表(WCF 不调用构造函数) .

除此之外:您还可以将protobuf-net 与数据合同和 WCF 一起使用(只要它们有明确的订单);这比常规的 xml 更密集。不过,它目前不支持消息合同。

【讨论】:

感谢 Marc,您对 Base 类的看法是正确的。它工作得更好一些。我将看一下 OnDeserializing 方法,为此欢呼。为此,我受制于 Xml。【参考方案2】:

虽然不是直接回答您的问题,但值得留意MSDN -Using Message Contracts 的以下内容

使用为使用该消息的服务合同选择的序列化引擎对每个单独的消息头和消息正文部分进行序列化(转换为 XML)。默认序列化引擎 XmlFormatter 可以显式处理任何具有数据协定的类型(通过具有 System.Runtime.Serialization .DataContractAttribute) 或隐式(作为原始类型,具有 System.SerializableAttribute 等)。

【讨论】:

以上是关于WCF:MessageContract、DataContract ... 感到困惑?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MessageContract 类型中使用 XML 属性?

数据合约与​​消息合约

多个保护级别在 WCF 中不起作用

WCF中可为空值类型的错误

将 DTO 与 WCF 结合使用

如何在 WCF 测试客户端 (WcfTestClient.exe) 中指定列表参数?