如何在WCF服务和客户端之间共享对象?

时间:2012-04-30 13:41:25

标签: .net wcf service remoting

我在分布式系统中有三个程序,它们依赖于WCF服务进行通信。如果我在WCF服务库中使用了数据类型,如何从引用该服务的客户端访问它?

我能够从客户端控制台应用程序实例化WCF服务中定义的对象,尽管我无法用它来做其他事情。我无法访问任何对象的成员方法或字段。

例如,我有一个在服务库和客户端中使用的Transaction对象类:

[DataContract]
public class Transaction
{
    public int checkoutID;
    public DateTime time;
    public List<object> products;
    public double totalPrice;
    public bool complete;

    [OperationBehavior]
    public void Start(int ID)
    {
        checkoutID = ID;
        products = new List<object>();
        complete = false;
    }

    [OperationBehavior]
    public void Complete()
    {
        time = DateTime.Now;
        complete = true;
    }
}

这取自服务(IService)的接口文件,其中定义了另一个类,称为CompositeType。我错过了什么?我以为WCF服务允许远程处理方法和数据类型?

感谢任何可以提供帮助的人,我一直遇到WCF问题。

3 个答案:

答案 0 :(得分:7)

WCF是消息传递系统 - 所有客户端和服务器共享都是服务合同(例如服务方法和使用的数据类型的结构)。 / p>

客户端和服务器之间的连接基本上是数据协定对象的XML序列化表示。但是WCF默认不共享代码 - 仅合同(例如,不是数据类型/类,只是它们的XML表示)。

因此,默认情况下,当客户端为给定服务创建客户端代理时,它将能够确定服务方法和来回传递的数据的XML形状 - 并且基于该信息,它将创建客户端数据类在线上具有完全相同的XML表示 - 但它们是不同的.NET类(在客户端名称空间中)。

如果您控制通信的两端 - 服务器和客户端 - 并且两者都在使用.NET,那么可以执行此操作:

  • 将您的服务和数据合同放入单独的程序集(YourService.Contracts或类似的程序集)

  • 让服务器端代码引用该程序集并使用其接口和类型

  • 之前创建客户端代理,添加对该共享合同程序集的引用

  • 在这种情况下,当您创建客户端代理(使用Add Service Referencesvcutil命令行工具)时,WCF运行时将检测到它知道所需的类型已经(因为它们是在共享程序集中定义的),它将重用那些共享类型,而不是创建新的仅客户端数据类。

答案 1 :(得分:0)

我无法完全理解您的问题,但是从上面粘贴的代码中,您将与WCF客户端共享方法,而不是字段/属性。您还需要在字段中应用[DataMember]属性。

答案 2 :(得分:0)

将[DataMember]标签添加到字段中 - 然后将它们序列化。

此外,[OperationContract]应该在方法上,而不是[OperationBehavior]