【问题标题】:Do WCF Services Expose Properties?WCF 服务是否公开属性?
【发布时间】:2010-10-23 21:09:35
【问题描述】:

在实现 WCF 服务所需的接口中,我用[ServiceContract()] 属性声明主类,用[OperationContract()] 声明任何公开的方法。

如何公开公共属性?谢谢

【问题讨论】:

    标签: c# wcf


    【解决方案1】:

    你不能。这不是它的工作原理。仅限方法。

    【讨论】:

    • 确实如此。只是为了扩展(不需要另一个答案)——它是一个 RPC 堆栈——而不是一个远程堆栈。如果你想要属性,从方法中返回一个对象,然后在客户端查看对象的属性。
    • 我同意 Marc 的观点,但请澄清:RPC 堆栈不是 WCF;而是它是 SOAP+WSDL 标准。他们所能描述的只是操作,在消息中发送。甚至没有实例的概念,那么你会从 from 获取什么属性?
    【解决方案2】:

    属性是组件接口的面向对象方面。 WCF 是关于服务,您必须在其中考虑和设计组件之间的交互顺序。

    由于往返成本、潜在的昂贵状态管理和版本控制挑战,面向对象不能很好地扩展到分布式场景(您的代码在多个服务器甚至多个进程中执行)。但是,OO 仍然是设计服务内部的好方法,尤其是在它们很复杂的情况下。

    【讨论】:

      【解决方案3】:

      由于属性的 get 部分是一种方法,这在技术上是可行的,但正如前面的答案/cmets 中所提到的,这可能是不可取的;只是张贴在这里作为一般知识。

      服务合同:

      [ServiceContract]
      public interface IService1
      {
          string Name
          {
              [OperationContract]
              get;
          }
      }
      

      服务:

      public class Service1 : IService1
      {
          public string Name
          {
              get { return "Steve"; }
          }
      }
      

      从您的客户端代码访问:

      var client = new Service1Client();
      var name = client.get_Name();
      

      【讨论】:

      • +1。然而,观众被警告不要解释“好的,所以我想我只是将我的属性更改为Java风格的GetXxx + SetXxx方法对,这样会更可取。”不,那宁愿毫无意义。在排除了两种语法味道相同的性能问题后,请随意公开您的属性访问器。
      【解决方案4】:

      您可以公开属性,但您必须使用[DataContract] 属性,并且可以将属性声明为属性的[DataMember] 属性。

      【讨论】:

        【解决方案5】:

        请不要将属性公开为 Web 方法。这在 HTTPS 中不起作用。我花了很多时间来识别和解决这个问题。最好的方法是在 WCF 中编写一个具体的返回方法。

        【讨论】:

          猜你喜欢
          • 2011-04-27
          • 1970-01-01
          • 2015-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-16
          • 1970-01-01
          相关资源
          最近更新 更多