【发布时间】:2009-12-24 00:09:41
【问题描述】:
我最近看到一个 WCF 服务使用 by ref 参数声明操作合同。
我不知道为什么要做出这个设计决定(操作无效),但此外,根据我的 WCF 知识,我无法判断这是否是一种好的做法。或者如果这不相关。
你怎么看?
【问题讨论】:
标签: wcf web-services arguments byref
我最近看到一个 WCF 服务使用 by ref 参数声明操作合同。
我不知道为什么要做出这个设计决定(操作无效),但此外,根据我的 WCF 知识,我无法判断这是否是一种好的做法。或者如果这不相关。
你怎么看?
【问题讨论】:
标签: wcf web-services arguments byref
但是,根据这篇 Microsoft 文章,WCF 调用的行为与远程过程调用完全相同,并且可以使用 ByRef 参数返回数据:-
http://msdn.microsoft.com/en-us/library/ms733070.aspx
参考章节:Out 和 Ref 参数
在大多数情况下,您可以使用 in 参数(Visual Basic 中的 ByVal)和 out 和 ref 参数(Visual Basic 中的 ByRef)。因为既出又出 ref 参数表示从操作返回的数据,一个 如下所示的操作签名指定一个 请求/回复操作是必需的,即使操作 签名返回无效。
【讨论】:
WCF 不是“远程对象调用”方法或任何东西 - 它是纯粹的消息传递。因此,使用“by-ref”参数可能会编译,但它实际上不会做任何有用的事情。
在您的客户端上,您有一个带有您调用的参数的方法。然后,WCF 运行时拦截该调用,将参数和所需的任何进一步信息打包到消息中,将该消息序列化(转换为文本或二进制 XML),并通过线路将该消息发送到服务器。
然后服务器将消息反序列化为一组参数,然后服务器上的调度程序组件将实例化服务类并使用消息中的参数调用该服务类实例上的适当方法。
整个故事倒退到服务器发回的回复。
但同样:您在客户端和服务器之间交换的只是一个序列化消息 - “通过 ref”创建参数绝对没有意义 - 它不可能是 by-ref 参数,到底。服务器和客户端是完全不同的世界,完全不同的对象和类——它们在网络上看起来是一样的。
所以我认为编写 WCF 方法的人并不了解 WCF 消息传递的原理,而是被 WCF 的感觉所吸引——就像只是一个方法调用。但说到底真的不只是一个方法调用。
【讨论】:
我和 marc_s 在一起。
你需要非常小心。
WCF 将始终为该对象分配一个新实例,而不仅仅是更改其内容。
正如 mars_s 已经解释的那样,wcf 是一个消息传递框架。 它的本质是发送和接收独立消息。
我认为一个好的做法是始终定义输入/输出消息。 您的服务接口将更易于理解和维护。
带有 ref- 和 out- 参数的方法总是很丑陋且难以理解。
【讨论】: