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

Lee*_*Lee 2 .net service wcf 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

mar*_*c_s 7

WCF是一个消息传递系统 - 所有客户端和服务器共享是服务契约(例如服务方法和使用的数据类型的结构).

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

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

如果你控制通信的两端 - 服务器和客户端 - 并且都使用.NET,你可以这样做:

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

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

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

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