我在分布式系统中有三个程序,它们依赖于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问题。
答案 0 :(得分:7)
WCF是消息传递系统 - 所有客户端和服务器共享都是服务合同(例如服务方法和使用的数据类型的结构)。 / p>
客户端和服务器之间的连接基本上是数据协定对象的XML序列化表示。但是WCF默认不共享代码 - 仅合同(例如,不是数据类型/类,只是它们的XML表示)。
因此,默认情况下,当客户端为给定服务创建客户端代理时,它将能够确定服务方法和来回传递的数据的XML形状 - 并且基于该信息,它将创建客户端数据类在线上具有完全相同的XML表示 - 但它们是不同的.NET类(在客户端名称空间中)。
如果您控制通信的两端 - 服务器和客户端 - 并且两者都在使用.NET,那么可以执行此操作:
将您的服务和数据合同放入单独的程序集(YourService.Contracts
或类似的程序集)
让服务器端代码引用该程序集并使用其接口和类型
之前创建客户端代理,添加对该共享合同程序集的引用
在这种情况下,当您创建客户端代理(使用Add Service Reference
或svcutil
命令行工具)时,WCF运行时将检测到它知道所需的类型已经(因为它们是在共享程序集中定义的),它将重用那些共享类型,而不是创建新的仅客户端数据类。
答案 1 :(得分:0)
我无法完全理解您的问题,但是从上面粘贴的代码中,您将与WCF客户端共享方法,而不是字段/属性。您还需要在字段中应用[DataMember]属性。
答案 2 :(得分:0)
将[DataMember]标签添加到字段中 - 然后将它们序列化。
此外,[OperationContract]应该在方法上,而不是[OperationBehavior]