gpt4 book ai didi

c# - WCF:MessageContract、DataContract……一头雾水?

转载 作者:IT王子 更新时间:2023-10-29 04:31:14 26 4
gpt4 key购买 nike

我正在编写我的第一个 WCF 服务。我决定先将服务作为 DLL 来编写,然后再考虑 WCF 的内容,这就是我现在所处的位置。

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

这是我的代码的示例。

[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 以便其他客户可以轻松使用我的服务的最佳策略是什么?

最佳答案

请求/响应 - [DataContract] 也可以。消息契约(Contract)的优点之一是您可以针对成员设置隐私,但在许多情况下这不是必需的。在这种情况下,我更愿意让契约(Contract)尽可能简单,就像数据契约(Contract)一样。

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

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

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

此外:您还可以使用 protobuf-net使用数据契约(Contract)和 WCF(只要它们有明确的订单);这比普通的 xml 更密集。不过,它目前不支持消息契约(Contract)。

关于c# - WCF:MessageContract、DataContract……一头雾水?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/673638/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com