2

我在分布式系统中有三个依赖 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 方面遇到了一段时间的问题。

4

3 回答 3

8

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

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

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

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

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

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

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

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

于 2012-04-30T13:46:43.323 回答
0

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

于 2012-04-30T13:46:11.937 回答
0

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

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

于 2012-04-30T13:46:17.510 回答