0

以下代码有什么问题......我有这个复杂的类:

public class Complex : MarshalByRefObject
    {

        public double imaginary{get;set;}
        public double real{get;set;}            

        public void setReal(double re)
        {
            real = re;
        }

        public void setImaginary(double im)
        {
            imaginary = im;
        }

        public Complex(double im, double re)
        {
            imaginary = im;
            real = re;
        }    

        public void writeMembers()
        {
            Console.WriteLine(real.ToString() + imaginary.ToString());
        }
    }

实际上,它还有一点,但是代码太大了,我们不会在这个上下文中使用它的其余部分。

然后,我实现了一个监听连接的服务器:

HttpChannel channel = new HttpChannel(12345);                
            ChannelServices.RegisterChannel(channel, false);
            RemotingConfiguration.RegisterWellKnownServiceType(typeof(SharedLib.Complex), "ComplexURI", WellKnownObjectMode.SingleCall);

            Console.WriteLine("Server started. Press any key to close...");
            Console.ReadKey();

            foreach (IChannel ichannel in ChannelServices.RegisteredChannels)
            {
                (ichannel as HttpChannel).StopListening(null);
                ChannelServices.UnregisterChannel(ichannel);
            }

然后,我们有客户端:

try
            {
                HttpChannel channel = new HttpChannel();
                RemotingConfiguration.Configure("Client.exe.config", false);

                Complex c1 = (Complex)Activator.GetObject(typeof(Complex), "http://localhost:12345/ComplexURI");                    


                if (RemotingServices.IsTransparentProxy(c1))
                {
                    c1.real = 4;
                    c1.imaginary = 5;    

                    c1.writeMembers();                    

                    Console.ReadLine();
                }
                else
                {
                    Console.WriteLine("The proxy is not transparent");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadLine();
            }
        }

然后,我运行服务器,打开一个控制台窗口,然后运行客户端。我没有在服务器窗口上显示 4 和 5,而是只得到 00,这表明成员没有更改。怎么办,所以成员变了?谢谢。

4

1 回答 1

1

问题是您正在使用WellKnownObjectMode.SingleCall. 正如文档所说:

  • SingleCall 每个传入的消息都由一个新的对象实例提供服务。
  • 单例 每个传入的消息都由同一个对象实例提供服务。

另请参阅RegisterWellKnownServiceType的文档:

当调用到达服务器时,.NET Framework 从消息中提取 URI,检查远程处理表以定位与 URI 匹配的对象的引用,然后在必要时实例化对象,将方法调用转发给对象. 如果对象注册为 SingleCall,则在方法调用完成后销毁。为每个调用的方法创建一个对象的新实例。

在您的情况下,该语句是对属性设置器c.Real = 4的调用。Real它调用远程对象,创建一个新对象,将Real属性设置为 4,然后返回。然后,当您设置imaginary属性时,它会创建一个新对象,等等。

如果你想让它工作,你必须使用WellKnownObjectMode.Singleton. 但是您可能想问问自己是否真的想要这样一个“健谈”的界面。每次设置属性时,都需要通过代理调用服务器。

最后,您可能会考虑完全放弃 Remoting。这是一项古老的技术,并且有许多缺点。如果这是新开发,您应该使用Windows Communications Foundation (WCF)。远程处理文档说:

本主题特定于为与现有应用程序向后兼容而保留的遗留技术,不建议用于新开发。现在应该使用 Windows Communication Foundation (WCF) 开发分布式应用程序。

于 2013-07-21T15:18:44.307 回答