2009-12-24 61 views
6

我最近看到一个WCF服务,声明参考的操作合同。WCF中的'ref'参数是坏的还是好的?

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

您认为如何?

回答

4

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

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

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

整个故事向后回复服务器发回的回复。

但是,您在客户端和服务器之间交换的所有内容都是序列化消息 - 在“通过ref”创建参数绝对没有意义 - 最终它不可能是by-ref参数。服务器和客户端是完全独立的世界,完全独立的对象和类 - 它们在线上看起来相同。

所以我认为谁写这个WCF方法不明白WCF消息传递的原则,但被WCF感觉的方式引诱 - 就像只是一个方法调用。但它最终不只是一个方法调用。

+4

这正是我以为。在你回复之后,我决定进行测试。 听起来很奇怪,但WCF基础结构处理ref:如果服务对ref参数进行更改,则在调用返回给客户端后,传递的参数会反映这些更改。 – MatteoSp 2009-12-24 14:18:21

+0

@MatteoSp:听起来很有趣!我从来没有想过尝试,因为从我所知道的我确信它永远不会工作 - 更好地尝试它自己! :-)仍然会问这是否真的是一个好主意,尽管如此...... – 2009-12-24 22:14:50

+3

@marc_s有点晚,但WCF默认情况下是RPC风格。毕竟我们在一个对象(代理)上调用一个方法,并通过魔术方法在服务器上运行。要使用'消息传递'风格,我们需要使用消息合约,它使我们能够完全控制SOAP消息。 – thewpfguy 2013-03-20 07:54:07

5

然而,根据这个Microsoft文章一个WCF呼叫的行为完全像一个远程过程调用和为ByRef参数可用于返回数据: -

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

具体请参考:out和ref参数

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

1

我与marc_s。

你需要非常小心。

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

由于mars_s已经解释过wcf是一个消息框架。 其本质是发送和接收内部消息。

我认为一个好的做法是总是定义一个in /和out-message。 您的sericve界面将更易于理解和维护。

带参数和参数的方法总是非常难看而且难以理解。