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

.net 如何在WCF服务和客户端之间共享对象?,.net,wcf,service,remoting,.net,Wcf,Service,Remoting,我在分布式系统中有三个程序,它们依赖WCF服务进行通信。如果我在WCF服务库中使用了数据类型,我如何从引用该服务的客户端访问它 我能够从客户机控制台应用程序实例化WCF服务中定义的对象,尽管我不能用它做很多其他事情。我无法访问对象的任何成员方法或字段 例如,我在服务库和客户端中使用了以下事务对象类: [DataContract] public class Transaction { public int checkoutID; public DateTime time;

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

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

例如,我在服务库和客户端中使用了以下事务对象类:

[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;
    }
}
[DataContract]
公共类事务
{
公共int签出ID;
公共日期时间;
公开上市产品;
公共双总价;
公共布尔完成;
[操作行为]
公共无效开始(int ID)
{
checkoutID=ID;
产品=新列表();
完整=错误;
}
[操作行为]
公开作废完成()
{
时间=日期时间。现在;
完整=正确;
}
}
这是从服务(IService)的接口文件中获取的,其中定义了另一个类,称为CompositeType。我错过了什么?我认为WCF服务允许远程处理方法和数据类型


多亏了能提供帮助的人,我在WCF方面遇到了一些问题。

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

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


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

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

客户端和服务器之间的连接基本上是数据契约对象的XML序列化表示。但是默认情况下,WCF不共享
纯代码契约(例如,不共享数据类型/类,只共享它们的XML表示)

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

如果控制通信的两端(服务器和客户端),并且两者都使用.NET,则可以执行以下操作:

  • 将您的服务和数据契约放在一个单独的程序集中(
    YourService.contracts
    或类似的东西)

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

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

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


谢谢你的回答。我以前也这样做过。我在DLL中有一个事务类,客户端和服务在本地引用该类,但是我无法让该服务工作,因为它一直报告在服务尝试运行时事务类无法序列化。如果我这样做,我需要声明事务类吗服务接口文件中的Action类字段和方法也存在吗?@Lee:首先-
事务
是一个非常糟糕的名字-它被.NET和T-SQL到处使用。我会尝试使用更有意义的东西。所以,也许你的服务选择了错误的类?是.NET
事务
类,而不是你自己的?我理解明白这一点,我会改变它。但是使用DLL,客户端想要它自己的名称空间。事务,就像服务器一样。如果你明白我的意思,他们从来没有同意实际的DLL名称空间。事务?另一个问题:你的
[DataContract]中不应该有任何逻辑(方法)
类-即使您使用共享汇编方法也不行。此外:如果您在类上使用
[DataContract]
,您还必须在字段/属性上使用
[DataMember]
对其进行序列化。您是否?看起来与您发布的示例不同(但这可能不完整)我的调试器在我没有为事务类方法定义主体时出错,因为它不是抽象的。我正在尝试让客户端和服务能够使用我定义为事务的对象,该对象有自己的字段和方法。我为服务添加了一个DLL,用于定义事务类,但服务失败由于无法序列化该类而无法承载。如何将其包含在序列化中?