首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WCF: MessageContract,DataContract ...迷惑了?

WCF: MessageContract,DataContract ...迷惑了?
EN

Stack Overflow用户
提问于 2009-03-23 14:44:05
回答 2查看 20K关注 0票数 23

我正在编写我的第一个WCF服务。我决定一开始就把这个服务写成一个DLL,然后把WCF的东西放在后面,这就是我现在所在的地方。

架构师建议我应该坚持消息对象的特定格式,我已经这样做了。然而,我在我的消息对象中使用了接口、复杂类型和列表。我要在上面添加属性,我有点困惑了。

下面是我的代码示例。

代码语言:javascript
复制
[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,以便其他客户端可以轻松使用我的服务?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-03-23 15:08:50

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

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

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

注意,与XmlSerializer不同的是,集合成员不一定要有setters -尽管如果这样做了,您可能需要添加一个OnDeserializing回调方法来初始化列表(WCF不调用构造函数)。

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

票数 18
EN

Stack Overflow用户

发布于 2013-03-18 15:45:02

尽管不能直接回答您的问题,但还是值得从MSDN -Using Message Contracts上注意以下几点

XML使用为使用消息的服务契约选择的序列化引擎来序列化(转换为

)每个单独的消息头和消息体部分。默认的序列化引擎,XmlFormatter,可以处理任何具有数据合约的类型,无论是显式(通过让系统。运行时。序列化。DataContractAttribute)或隐式(通过成为原语类型、具有System.SerializableAttribute等)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/673638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档