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

本文关键字:成员 函数 WCF 自定义 通过 | 更新日期: 2023-09-27 17:50:27

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

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

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

我需要你的提示。

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

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

然而,这破坏了契约实现的独立性,因为完全相同的服务组件需要同时存在于客户端和服务器上,并且在每次更改时保持同步。

默认情况下,WCF将只在客户端和服务器之间共享合约,例如您的服务([ServiceContract]),它们的方法([OperationContract])和它们操作的数据结构([DataContract])。

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

基本上,如果你想公开功能,你需要有一个用[OperationContract]属性装饰的服务方法。数据类上的方法永远不会对客户端可见——这是设计的。

如果你控制了通信的两端,并且都是基于。net的,你可以"欺骗"你的方式绕过这个限制:

  • 把所有的服务和数据契约放到一个单独的类库程序集中
  • 使用对该公共共享程序集的引用来创建服务
  • 执行Add Service Reference之前,在客户端上添加对该通用程序集的引用
在这种情况下,WCF运行时将重用该公共程序集中的现有类型,而不是从服务描述中重新创建它们。由于该程序集包含服务器也使用的共享代码,所以您的类也有它们的方法。

它只在。net环境下工作得很好,但在适当的服务分离表象背后,它确实是一种肮脏的把戏。