0

次のコードの問題は何ですか...私はこの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();
            }
        }

次に、コンソール ウィンドウを開くサーバーを実行し、クライアントを実行します。サーバー ウィンドウに 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 に答える