c# - 如何在 WCF 中使用接口(interface)作为数据契约

标签 c# wcf interface datacontract operationcontract

我需要使用标准 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/

相关文章:

Java在派生类中实现接口(interface)方法的方式

c# - 为什么不能在 C# 中没有大括号的 switch 部分中使用 using 变量?

c# - Entity Framework 通配符和 Linq

c# - 将 mongodb 连接到 C#

.net - 周转基金。 REST 架构。如何在 JSON (POST) 中从客户端获取对象

java - 在 RMI 中将子类对象转换为父类(super class)引用

c# - 从MySql中选择年龄并将其显示在Chart控件中

wcf - C# : Instant Messager - Networking (. NET 远程处理/WCF/套接字)?

c# - System.ServiceModel.Clientbase.Open() 是做什么的?

grails - 如何在 Grails 域类中使用接口(interface)类型对象