WCF中的'by ref'参数是坏还是好?

Mat*_*oSp 6 wcf arguments web-services byref

我最近看到一个WCF服务通过ref参数声明操作合同.

我不知道为什么要做出这样的设计决定(操作无效),而且,根据我的WCF知识,我无法说这是否是一个好的做法.或者如果这不相关.

你怎么看?

小智 5

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

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

请参阅以下部分:Out和Ref Parameters

在大多数情况下,您可以在参数(Visual Basic中的ByVal)和out和ref参数(Visual Basic中的ByRef)中使用.因为out和ref参数都指示从操作返回数据,所以操作签名(如下所示)指定即使操作签名返回void也需要请求/回复操作.


mar*_*c_s 4

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

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

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

整个故事是从服务器发回的回复开始的。

但再说一遍:客户端和服务器之间交换的只是一条序列化消息——“按引用”创建参数绝对没有意义——最终它不可能是按引用参数。服务器和客户端是完全独立的世界,完全独立的对象和类——它们只是在网络上看起来是一样的。

因此,我认为编写 WCF 方法的人并没有理解 WCF 消息传递的原理,而是被 WCF 的感觉所吸引 - 就像只是一个方法调用。但最终它实际上不仅仅是一个方法调用。

  • 这正是我的想法。在您回复后,我决定进行一次测试。听起来很奇怪,但 WCF 基础结构处理 by ref:如果服务对 by ref 参数进行更改,则在调用返回到客户端后,传递的参数会反映这些更改。 (4认同)
  • @marc_s 有点晚了,但是,WCF 默认是 RPC 风格。毕竟,我们正在调用对象(代理)上的方法,并且该方法神奇地在服务器上运行。要使用“消息传递”样式,我们需要使用消息契约,它使我们能够完全控制 SOAP 消息。 (3认同)