.net 如何在WCF服务和客户端之间共享对象?
我在分布式系统中有三个程序,它们依赖WCF服务进行通信。如果我在WCF服务库中使用了数据类型,我如何从引用该服务的客户端访问它 我能够从客户机控制台应用程序实例化WCF服务中定义的对象,尽管我不能用它做很多其他事情。我无法访问对象的任何成员方法或字段 例如,我在服务库和客户端中使用了以下事务对象类:.net 如何在WCF服务和客户端之间共享对象?,.net,wcf,service,remoting,.net,Wcf,Service,Remoting,我在分布式系统中有三个程序,它们依赖WCF服务进行通信。如果我在WCF服务库中使用了数据类型,我如何从引用该服务的客户端访问它 我能够从客户机控制台应用程序实例化WCF服务中定义的对象,尽管我不能用它做很多其他事情。我无法访问对象的任何成员方法或字段 例如,我在服务库和客户端中使用了以下事务对象类: [DataContract] public class Transaction { public int checkoutID; public DateTime time;
[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
命令行工具)时,WCF运行时将检测到它已经知道所需的类型(因为这些类型是在共享程序集中定义的),它将重用这些共享类型,而不是创建新的仅客户端数据类svcutil
事务
是一个非常糟糕的名字-它被.NET和T-SQL到处使用。我会尝试使用更有意义的东西。所以,也许你的服务选择了错误的类?是.NET事务
类,而不是你自己的?我理解明白这一点,我会改变它。但是使用DLL,客户端想要它自己的名称空间。事务,就像服务器一样。如果你明白我的意思,他们从来没有同意实际的DLL名称空间。事务?另一个问题:你的[DataContract]中不应该有任何逻辑(方法)
类-即使您使用共享汇编方法也不行。此外:如果您在类上使用[DataContract]
,您还必须在字段/属性上使用[DataMember]
对其进行序列化。您是否?看起来与您发布的示例不同(但这可能不完整)我的调试器在我没有为事务类方法定义主体时出错,因为它不是抽象的。我正在尝试让客户端和服务能够使用我定义为事务的对象,该对象有自己的字段和方法。我为服务添加了一个DLL,用于定义事务类,但服务失败由于无法序列化该类而无法承载。如何将其包含在序列化中?