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