我正在编写我的第一个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,以便其他客户端可以轻松使用我的服务?
发布于 2009-03-23 15:08:50
Re请求/响应-- [DataContract]也同样有效。消息契约的优点之一是您可以针对成员设置隐私,但在许多情况下这并不是必需的。在这种情况下,我更喜欢保持合同尽可能简单,就像数据合同一样。
Re哪个序列化程序-这在很大程度上是配置的一个因素。例如,默认情况下,通过http,它将是DataContractSerializer。
然而,我不确定IMyComplexType的列表是否会工作得很好。您可以尝试,但通常它需要具体的类型。请注意,对于基类,您可以使用[KnownType]来指定允许的子类型。
注意,与XmlSerializer不同的是,集合成员不一定要有setters -尽管如果这样做了,您可能需要添加一个OnDeserializing回调方法来初始化列表(WCF不调用构造函数)。
另外:您还可以将protobuf-net与数据契约和WCF一起使用(只要它们有明确的顺序);这比常规的xml更密集。不过,目前它还不支持消息契约。
发布于 2013-03-18 15:45:02
尽管不能直接回答您的问题,但还是值得从MSDN -Using Message Contracts上注意以下几点
XML使用为使用消息的服务契约选择的序列化引擎来序列化(转换为
)每个单独的消息头和消息体部分。默认的序列化引擎,XmlFormatter,可以处理任何具有数据合约的类型,无论是显式(通过让系统。运行时。序列化。DataContractAttribute)或隐式(通过成为原语类型、具有System.SerializableAttribute等)。

https://stackoverflow.com/questions/673638
复制相似问题