2011-04-17 46 views
2

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

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

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

我需要你的提示,该怎么做。

回答

0

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

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

有关更多详细信息,请参见here

0

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

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

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

如果你控制通信的两端都是基于.NET的,你可以“欺骗”自己的方式来解决此限制:

  • 把所有的服务和数据合同到一个单独的类库装配
  • 使用引用到公共的共享组件
  • 之前创建的服务,你做一个Add Service Reference,您的客户端添加到常用程序集的引用

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

它只适用于.NET的情况下可以正常工作,但它确实是适当的服务分离门面背后的肮脏窍门。