是否可以通过引用WCF传递参数

是否可以通过引用WCF传递参数,wcf,Wcf,我正在尝试学习和使用WCF,但我对是否可以通过引用传递参数感到困惑。我尝试从正在通过引用传递参数的客户端调用操作契约(每次都会超时,即使服务和客户端都在我的本地计算机上),这让我费了好一阵子。然而,VisualStudio提供的测试客户端可以毫无问题地调用操作契约(即使使用引用参数)。然而,当调用只包含值参数的操作契约时,我的客户端成功了 我在MSDN上看到了这篇文章,但我一定没有正确理解它,因为它似乎自相矛盾(至少我是这样解释的): 在标题“参数和返回值”下,它指出: 每个操作都有一个返回值和

我正在尝试学习和使用WCF,但我对是否可以通过引用传递参数感到困惑。我尝试从正在通过引用传递参数的客户端调用操作契约(每次都会超时,即使服务和客户端都在我的本地计算机上),这让我费了好一阵子。然而,VisualStudio提供的测试客户端可以毫无问题地调用操作契约(即使使用引用参数)。然而,当调用只包含值参数的操作契约时,我的客户端成功了

我在MSDN上看到了这篇文章,但我一定没有正确理解它,因为它似乎自相矛盾(至少我是这样解释的):

在标题“参数和返回值”下,它指出:

每个操作都有一个返回值和一个参数,即使它们是 无效的但是,与本地方法不同,在本地方法中可以传递引用 对于从一个对象到另一个对象的对象,服务操作不会传递 对对象的引用。相反,它们传递对象的副本

在标题“Out和Ref参数”下进一步指出:

在大多数情况下,可以在参数中使用(VisualBasic中的ByVal)和 out和ref参数(VisualBasic中的ByRef)。因为外面和外面 ref参数表示从操作返回的数据 下面这样的操作签名指定 请求/回复操作是必需的,即使该操作 签名无效

我正在对.net客户端使用netTcpBinding,并且(至少在这一点上)正在尝试通过引用传递字符串。我错过了什么?这可能吗

更新:
似乎如果我的操作契约不返回类型(c#/vb中的void/sub),那么我可以通过引用成功地传递参数(甚至多个参数)。我猜这就是它的设计方式,因为在请求/应答操作中,引用参数取代了返回值。

可以使用by ref参数,但请记住

此外,使用out或ref参数要求操作具有基础 返回修改对象的响应消息。如果您的操作是单向的 操作时,在运行时引发InvalidOperationException异常


对。你是对的。参考参数按值传递,如文档所示。他们复制了它们。您是对的,使用的模型是Request\Reply。原因是引用实际上是一天结束时的地址,对吗?因此,一台机器上的地址不会在另一台机器上得到相同的结果(明白我的意思吗?)。 数据的发送和接收方式是不同的。我鼓励您查看在添加服务引用时创建的代理类。此文件的名称通常为Reference.cs,您可以双击引用并通过对象浏览器访问它

假设您的合同方法是int GetMyData(ref string modifyMe)

如果查看ServiceClient类(假设您的服务称为服务),您将看到GetMyDataRequest对象有一个string类型的成员,返回的GetMyDataResponse对象有两个integer和string类型的成员。这就是ServiceClient类中的包装器方法中发生的情况

C#:

VB:

因此,对于作为客户机的您来说,您的字符串是通过引用传递的,但是在后台,修改后的值被分配回您传入的字符串变量。
希望这有帮助。

不创建副本是不可能的

如果希望客户机直接操作服务器中的对象,或者希望客户机直接操作服务器中的对象,则无论是否:

  • 两者都在同一进程中(不同的AppDomains)
  • 在同一台机器上分开处理
  • 不同的机器
参考。与WCF不同,远程处理在幕后创建代理,隐藏所有消息传递


.NET远程处理仍然很有用,因为必须使用它与不同AppDomain中的对象通信。

RE:您的更新;您应该能够执行类似于
布尔处理(CompositeObj,ref String Errors)
(至少我能够)Hrm的操作,因为某些原因,我无法做到这一点。这不是什么大不了的事,因为我可以简单地将我的返回值转换成另一个引用参数(因为没有返回值,我可以拥有无限的引用参数)。但如果能同时做到这两件事就更好了。你说的有道理。直到现在,我还没有查看生成的代理类,但是它看起来与您描述的不同。我正在使用vb.net,我怀疑这可能与此有关。但我在Reference.vb中看到的是:公共子GetMyData(ByRef值作为字符串)实现Service.GetMyData MyBase.Channel.GetMyData(值)end子脚本:公共函数GetMyData(ByRef值作为字符串)作为整数Dim inValue作为ServiceReference1.GetMyDataRequest=新的ServiceReference1.GetMyDataRequest()inValue.value=value Dim retVal As ServiceReference1.GetMyDataResponse=CType(Me,ServiceReference1.IService1)。GetMyData(inValue)value=retVal.value Return retVal.GetMyDataResult结束函数“ref”是一种错觉。此外,客户端对象最终将被来自服务器的新对象“覆盖”。
public int GetMyData(ref string value) {
    WCFServiceClientApp.ServiceReference1.GetMyDataRequest inValue = new WCFServiceClientApp.ServiceReference1.GetMyDataRequest();
    inValue.value = value;
    WCFServiceClientApp.ServiceReference1.GetMyDataResponse retVal = ((WCFServiceClientApp.ServiceReference1.IService1)(this)).GetMyData(inValue);
    value = retVal.value;
    return retVal.GetMyDataResult;
    }
Public Function GetMyData(ByRef value As String) As Integer
    Dim inValue As ServiceReference1.GetMyDataRequest = New ServiceReference1.GetMyDataRequest()
    inValue.value = value
    Dim retVal As ServiceReference1.GetMyDataResponse = CType(Me,ServiceReference1.IService1).GetMyData(inValue)
    value = retVal.value
    Return retVal.GetMyDataResult
End Function