簡體   English   中英

.NET遠程處理和服務器激活的對象

[英].NET Remoting and Server Activated Objects

以下代碼有什么問題...我有這個Complex類:

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();
            }
        }

然后,我運行服務器,這將打開一個控制台窗口,然后運行客戶端。 我只得到00,而不是在服務器窗口上顯示4和5,這表明成員沒有更改。 我該怎么做,所以成員會改變嗎? 謝謝。

問題是您正在使用WellKnownObjectMode.SingleCall 文檔所述

  • SingleCall每個傳入消息都由一個新的對象實例提供服務。
  • 單例每個傳入消息均由同一對象實例提供服務。

另請參見RegisterWellKnownServiceType的文檔:

當調用到達服務器時,.NET Framework從消息中提取URI,檢查遠程處理表以找到與URI相匹配的對象的引用,然后在必要時實例化該對象,將方法調用轉發給該對象。 如果對象注冊為SingleCall,則在方法調用完成后將銷毀該對象。 將為每個調用的方法創建一個對象的新實例。

在您的情況下,語句c.Real = 4是對Real屬性設置器的調用。 它調用遠程對象,該對象創建一個新對象,將Real屬性設置為4,然后返回。 然后,當您設置imaginary屬性時,它將創建一個新對象,依此類推。

如果您希望此方法有效,則必須使用WellKnownObjectMode.Singleton 但是您可能想問自己,是否真的想要這樣的“聊天”界面。 每次設置屬性時,都需要通過代理調用服務器。

最后,您可以考慮完全放棄遠程處理。 它是舊技術,並且有許多缺點。 如果這是新開發的,則應該使用Windows Communications Foundation (WCF)。 遠程處理文檔說:

本主題特定於保留的舊技術,以與現有應用程序向后兼容,不建議用於新開發。 現在應該使用Windows Communication Foundation(WCF)開發分布式應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM