我需要使用标准 wsdl 调用 Web 服务操作,但客户端和服务器中的数据对象必须不同。
使用公共(public)库中数据对象的接口(interface),在客户端和服务器中为其制作代理类。
然后,我使用该接口(interface)声明操作契约,但 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);
}
单击此处确实可以看到 Sample project on GitHub使用测试用例
最佳答案
我已经使用契约(Contract)创建了 WCF 服务:
[OperationContract]
CompositeTypeServer GetDataUsingDataContract( CompositeTypeServer composite );
我的CompositeTypeServer
看起来像这样:
[DataContract( Namespace = "http://enes.com/" )]
public class CompositeTypeServer
{
[DataMember]
public bool BoolValue { get; set; }
[DataMember]
public string StringValue { get; set; }
}
然后我创建了类型为 CompositeTypeClient
的客户端项目:
[DataContract( Namespace = "http://enes.com/" )]
public class CompositeTypeClient
{
[DataMember]
public bool BoolValue { get; set; }
[DataMember]
public string StringValue { get; set; }
}
然后,我添加了对我的服务的引用并选择重用类型。一切都很顺利。我能够在客户端使用 CompositeTypeClient
。
因此,技巧是为 DataContract 指定命名空间,以便它们在客户端和服务上都匹配。
[DataContract( Namespace = "http://enes.com/" )]
PS。我可以根据要求提供完整的 VS 解决方案。
关于c# - 如何在 WCF 中使用接口(interface)作为数据契约,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15841636/