1

これが私の問題です。私は wcf を使用して単純なクライアント サーバーを実装しています。サーバーは、クライアントから送信された値がグローバル合計に追加される「合計」関数を公開し、この合計はその時点でサーバーに接続されているすべてのクライアントに返されます。これが機能です

  public void AddMessage(int num)
    {
        sum = sum + num;
        //Go through the list of connections and call their callback funciton
        subscribers.ForEach(delegate(IMessageCallback callback)
        {
            if (((ICommunicationObject)callback).State == CommunicationState.Opened)
            {
                Console.WriteLine("Calling OnMessageAdded on callback ({0}).", callback.GetHashCode());

                callback.OnMessageAdded(sum, DateTime.Now);
            }
            else
            {
                subscribers.Remove(callback);
            }
        });

    }

これは、サーバーが呼び出すコールバック関数です

 public void OnMessageAdded(int sum, DateTime timestamp)
    {
        Console.WriteLine(sum+ ": " + timestamp.ToString("hh:mm:ss"));
    }

この部分までは問題ありません。クライアントとサーバーを別のポート (8001) で実行してみました。クライアントは最初にポート 8000 をリッスンしているサーバーに接続し、合計を取得したら、8001 でリッスンしているサーバーを更新します。

これを行うコードは次のとおりです。

  //This is the function that the SERVER will call
    public void OnMessageAdded(int sum, DateTime timestamp)
    {
        Console.WriteLine(sum + ": " + timestamp.ToString("hh:mm:ss"));
        WCFService.RCRServer.Sum=sum;
        Console.WriteLine("8001's sum " + WCFService.RCRServer.Sum);
    }

ご覧のとおり、'sum' は RCRServer の静的フィールドです。これが宣言されている方法です。

        private static int sum =0;

    public static int Sum
    {
        get { return sum; }
        set { sum = value; }

    }

この更新も問題ありません。ポート 8000 への接続が失われたときに問題が発生し、ポート 8001 で同じサービスを呼び出そうとしました。このサーバー(8001)の機能では、古い合計が利用可能になります。しかし、0にリセットされ、カウントが再開されます。ここでどこが間違っているのでしょうか。アドバイスをいただければ幸いです。ありがとう。

4

1 に答える 1

0

この行は間違っていると思います:

 WCFService.RCRServer.Sum=sum;

これは標準の WCF 呼び出しではなく、プロパティ呼び出しであるためです。WCF 呼び出しを介してプロパティをリンクするには、getter と setter を Operation Contract 属性で明示的にマークする必要がありますが、インターフェイスは静的コンストラクトで実装できないため、実際に呼び出されているものは別のものであると言えます。

静的変数を増やしてそのメソッドを呼び出す UpdateSum(int sum) という WCF メソッドを実装してみてください。

于 2012-10-01T16:03:12.190 に答える