【发布时间】:2013-04-05 19:08:27
【问题描述】:
我需要使用标准 wsdl 调用 webservice 操作,但是客户端和服务器中的数据对象必须不同。
在公共库中为数据对象使用接口,在客户端和服务器中为其创建代理类。
然后,我正在使用接口声明操作合同,但 WCF 不识别它。
我还尝试过使用 DataContractSerializerBehavior 并设置 knownTypes,但还没有成功。
有人可以帮我吗?我附上了包含更多详细信息的完整解决方案。
public interface Thing
{
Guid Id {get;set;}
String name {get;set;}
Thing anotherThing {get;set;}
}
[DataContract]
public class ThingAtServer: BsonDocument, Thing // MongoDB persistence
{
[DataMember]
Guid Id {get;set;}
//...
}
[DataContract]
public class ThingAtClient: Thing, INotifyPropertyChanged // WPF bindings
{
[DataMember]
Guid Id {get;set;}
//...
}
[ServiceContract]
public interface MyService
{
[OperationContract]
Thing doSomething(Thing input);
}
点击此处查看带有 TestCases 的 Sample project on GitHub
【问题讨论】:
-
您没有显示
Thing的定义方式——它也有[DataContract]吗?[BsonDocument]呢?通常,您必须为 WCF 服务定义 单独、轻量级(DTO 样式)对象 - 不要从 MongoDB 基类之类的东西继承 - 您不需要也不想序列化所有这些状态通过您的 WCF 服务.... -
另外:WCF 是一个基于 XML 的消息传递系统 - 所以你在 WCF 中传递的任何东西都必须在 XML 模式 (XSD) 中表示; XSD 不支持接口不 - 您需要使用具体类(也不支持泛型...)
标签: c# wcf interface datacontract operationcontract