【问题标题】:Are 'by ref' arguments in WCF bad or good?WCF 中的“by ref”参数是好是坏?
【发布时间】:2009-12-24 00:09:41
【问题描述】:

我最近看到一个 WCF 服务使用 by ref 参数声明操作合同。

我不知道为什么要做出这个设计决定(操作无效),但此外,根据我的 WCF 知识,我无法判断这是否是一种好的做法。或者如果这不相关。

你怎么看?

【问题讨论】:

    标签: wcf web-services arguments byref


    【解决方案1】:

    但是,根据这篇 Microsoft 文章,WCF 调用的行为与远程过程调用完全相同,并且可以使用 ByRef 参数返回数据:-

    http://msdn.microsoft.com/en-us/library/ms733070.aspx

    参考章节:Out 和 Ref 参数

    在大多数情况下,您可以使用 in 参数(Visual Basic 中的 ByVal)和 out 和 ref 参数(Visual Basic 中的 ByRef)。因为既出又出 ref 参数表示从操作返回的数据,一个 如下所示的操作签名指定一个 请求/回复操作是必需的,即使操作 签名返回无效。

    【讨论】:

      【解决方案2】:

      WCF 不是“远程对象调用”方法或任何东西 - 它是纯粹的消息传递。因此,使用“by-ref”参数可能会编译,但它实际上不会做任何有用的事情。

      在您的客户端上,您有一个带有您调用的参数的方法。然后,WCF 运行时拦截该调用,将参数和所需的任何进一步信息打包到消息中,将该消息序列化(转换为文本或二进制 XML),并通过线路将该消息发送到服务器。

      然后服务器将消息反序列化为一组参数,然后服务器上的调度程序组件将实例化服务类并使用消息中的参数调用该服务类实例上的适当方法。

      整个故事倒退到服务器发回的回复。

      但同样:您在客户端和服务器之间交换的只是一个序列化消息 - “通过 ref”创建参数绝对没有意义 - 它不可能是 by-ref 参数,到底。服务器和客户端是完全不同的世界,完全不同的对象和类——它们在网络上看起来是一样的。

      所以我认为编写 WCF 方法的人并不了解 WCF 消息传递的原理,而是被 WCF 的感觉所吸引——就像只是一个方法调用。但说到底真的不只是一个方法调用。

      【讨论】:

      • 这正是我的想法。在您回复后,我决定进行测试。听起来很奇怪,但 WCF 基础结构会处理 by ref:如果服务对 by ref 参数进行更改,则在调用返回给客户端后,传递的参数会反映这些更改。
      • @MatteoSp:这很有趣!我什至从不费心尝试,因为据我所知,我确信它永远不会起作用 - 最好自己尝试一下! :-) 不过,如果这真的是一个好主意,仍然会提出问题....
      • @marc_s 有点晚了,但是默认情况下,WCF 是 RPC 样式。毕竟我们是在一个对象(代理)上调用一个方法,并且神奇地该方法在服务器上运行。要使用“消息”样式,我们需要使用消息契约,它可以让我们完全控制 SOAP 消息。
      【解决方案3】:

      我和 marc_s 在一起。

      你需要非常小心。

      WCF 将始终为该对象分配一个新实例,而不仅仅是更改其内容。

      正如 mars_s 已经解释的那样,wcf 是一个消息传递框架。 它的本质是发送和接收独立消息。

      我认为一个好的做法是始终定义输入/输出消息。 您的服务接口将更易于理解和维护。

      带有 ref- 和 out- 参数的方法总是很丑陋且难以理解。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-23
        • 1970-01-01
        • 2014-07-23
        • 2011-10-08
        • 2010-11-26
        相关资源
        最近更新 更多