【问题标题】:Value of property is not changed after .net remoting call [duplicate].net远程调用后属性值没有改变[重复]
【发布时间】:2012-10-30 18:34:50
【问题描述】:

可能重复:
How do the In and Out attributes work in .NET?

我正在使用 .Net Remoting(是的,我知道......这很旧)来实现一些托管在 Windows 服务中的服务类。

我在服务上调用DoOperation(Person[] people) 方法来更改Person 类中的某些属性,就像下面的代码一样:

Person p = new Person();
p.SomeProperty = "This value should be changed by the service";

RemoveSvc svc = (RemoveSvc)Activator.GetObject(
    typeof(RemoveSvc),
    "tcp://localhost:6100/RemoteService.rem");

svc.DoOperation(new Person[]{ p });

// This writes the old value not the one changed by the service.
Console.WriteLine(p.SomeProperty); 

DoOperation 方法代码如下所示:

public void DoOperation(Person[] people) {
    foreach(var o in people)
        p.SomeProperty = "New Value";
}

这里的问题是当方法返回时Person.SomeProperty的值在客户端代码中没有更新。

我已经仔细检查了Person 类是可序列化的;

svc 变量的类型为 TranparentProxy

RemoteSvc 类继承MarshalByRefObject

我正在使用 .net Framework 4(不,我无法迁移到 WCF)

我做错了什么? 这是.net Remoting 的预期行为吗?如果是,有办法改变吗?

Tks

【问题讨论】:

    标签: c# .net remoting


    【解决方案1】:

    服务不是这样工作的。服务不是内存中的操作。当您使用在本地计算机上编写的类执行您所展示的操作时,您自然会看到对 Person 对象的更改,因为您正在调用者和方法之间传递内存引用。自然,它是完全相同的人对象

    但是,当您使用服务或远程处理时,它不再是同一个人。实际上,您在问题中说明了这一点。您对人进行序列化,然后通过网络将其发送出去。在同一个共享内存寄存器中不是同一个人。因此,服务器上Person 的更改将不会在客户端中看到。

    为了得到你想要的,这里是你的函数签名。

    public Person[] DoOperation(Person[] people);
    

    您可以更改签名以保留引用。然后对象将在客户端的服务器之间保持同步。 See this article 了解更多信息。

    public void DoOperation(ref Person[] people);
    

    【讨论】:

    • 为什么,当我将方法的签名更改为DoOperarion(ref Person p) 并更改它的值时它确实有效? .Net Remoting 足够聪明,知道这里的引用是一样的吗?
    • 这就是ref 说明符的作用。它会更改签名以使客户端和服务器保持同步。
    • 对不起,将ref 应用于数组不起作用...这是令人困惑的行为...
    【解决方案2】:

    Jarrett 是正确的,但这可能只是解决方案的一部分。问题是即使您传递了对数组的引用,您仍然在数组中复制了Persons。因此远程更改其中之一不会影响本地副本。您可能需要通过数组来引用它们,而不是使用本地引用。

    我会尝试类似:

    var temp = new Person[]{ p }
    svc.DoOperation(temp);
    
    // This writes the old value not the one changed by the service.
    Console.WriteLine(temp[0].SomeProperty); 
    

    可能使用远程调用创建的代理从远程位置获取Person,而不是使用本地引用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-27
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 2017-01-20
      • 1970-01-01
      • 2016-08-07
      相关资源
      最近更新 更多