【问题标题】:Exposing Member Functions in a Custom Class through WCF通过 WCF 在自定义类中公开成员函数
【发布时间】:2013-12-07 02:17:13
【问题描述】:

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

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

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

我需要你的提示。

【问题讨论】:

    标签: c# wcf


    【解决方案1】:

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

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

    更多详情请见here

    【讨论】:

      【解决方案2】:

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

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

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

      如果您控制通信的两端并且都是基于 .NET 的,您可以“欺骗”解决这个限制:

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

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

      它在仅 .NET 的场景中运行良好,但在正确的服务分离门面背后确实是一种肮脏的把戏。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 2023-03-19
        • 1970-01-01
        • 2012-08-07
        • 1970-01-01
        相关资源
        最近更新 更多