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