0

netTCPBinding を使用して、二重チャネルで動作する WCF サービスと WCF クライアントがあります。

接続ユーザーを辞書に保存します ( Dictionary<int userID,CallbackInstance instance>)

ユーザーが定期的に切断する場合は、サービスから切断を呼び出して、接続済みユーザー リストからユーザーを削除します。それは正常に動作します。

しかし、クライアント pc が不規則に切断されると、クライアントは Disconnect メソッドを呼び出すことができず、クライアントは接続されたユーザー リストに残っているため、これが問題です。私のWCFサーバーがコールバックのためにオンラインユーザーのサーバーをチェックすると、サーバーはクライアントのコールバックメソッドを呼び出そうとしますが、クライアントが利用できず、WCFサーバーアプリがクラッシュします。

コールバック インスタンスを呼び出す前にクライアントのステータスを確認することはできますか?

4

2 に答える 2

0

私はこれを修正します:

1.クライアントからサーバーにpingを送信して、30秒ごとに接続をアクティブに保つ方法。

2.サーバーバインディングでは、1分のReceiveTimeout。

3.Foreach コールバックは IcommunicationObject を作成し、Closed イベントを使用して非アクティブなクライアントを削除しました。

//Adding a client callback 

OperationContext context = OperationContext.Current;
ICallback callback = context.GetCallbackChannel(); 
ICommunicationObject obj = (ICommunicationObject)callback; 
obj.Closed += new EventHandler(obj_Closed);



//Event for inactive clients
 void obj_Closed(object sender, EventArgs e)
    {
        if (_callbacks.ContainsValue(((ITecnobelRemoteServiceCallback)sender)))
        {
            var item = _callbacks.First(kvp => kvp.Value == ((ITecnobelRemoteServiceCallback)sender));
            _callbacks.Remove(item.Key);
            treeViewClients.Nodes.RemoveByKey(item.Key.Id);
            treeViewClients.Refresh();
            _registeredUsers--;
            listBoxStatus.Items.Add(String.Format("Usuário {0} estava inativo e foi removido", item.Key.Id));
        }
    }
于 2014-08-05T15:53:25.940 に答える
0

非アクティブなクライアントを自動的に削除するようにすべてのプロパティのタイムアウトが設定されていることを確認してから、try catch ブロックでタイムアウト例外をキャッチし、辞書から削除します。

于 2014-07-20T11:49:03.407 に答える