通过WCF在自定义类中公开成员函数

时间:2011-04-17 09:09:47

标签: c# wcf

我在我的服务中创建了三个自定义类中的一些成员函数。我的目标是在客户端使用这些自定义类来访问服务中的成员函数。如何将这些类及其中的所有成员方法公开给客户端?

我在我的服务中创建了这三个类,并将它们标记为“DataContract”,该成员的功能为“OperationContract”。我创建了一个接口,将这些自定义类定义为OperationContracts,通过在单独的类上实现它们来返回每个类的对象。

不幸的是,我无法实现我的目标,因为其中两个类都有一个带有一些参数的构造函数,而没有构造函数的类在客户端可以访问,但我看不到类中的成员方法。

我需要你提示如何做。

2 个答案:

答案 0 :(得分:0)

这不容易做到。一种方法是在WCF服务器及其客户端之间共享DataContract - 修饰类型,即在客户端项目中添加对服务程序集的引用,并将服务引用绑定到该程序集引用。

但是,这会破坏合同实现的独立性,因为客户端和服务器上都需要存在完全相同的服务程序集,并且每次更改时都要保持同步。

有关详细信息,请参阅here

答案 1 :(得分:0)

默认情况下,根据设计,WCF只会在客户端和服务器之间共享合同,例如您的服务([ServiceContract]),他们的方法([OperationContract])及其操作的数据结构([DataContract])。

WCF是一个消息传递系统,因此所传递的数据的所有客户端和服务器共享都是XML序列化消息格式。当您添加服务引用时,客户端代理将为每个[DataContract]生成一个类,该类在XML序列化格式中看起来相同 - 只有数据来回移动 - 否行为(没有方法)。

基本上,如果您想公开功能,则需要使用[OperationContract]属性修饰的服务方法。您的数据类的方法将从不对客户端可见 - 这是设计的。

如果您控制通信的两端并且两者都是基于.NET的,那么您可以“欺骗”您的方式绕过此限制:

  • 将所有服务和数据合同放入单独的类库程序集
  • 使用对该常用共享程序集的引用来创建服务
  • 之前执行Add Service Reference,在客户端添加对该常用程序集的引用

在这种情况下,WCF运行时将重用该公共程序集中的现有类型,而不是从服务描述中重新创建它们。由于该程序集包含服务器也使用的共享代码,因此您的类也可以使用它们的方法。

它在仅适用于.NET的场景中运行正常,但它确实是正确的服务分离外观背后的一种肮脏技巧。