C# 在WCF中调用回调方法之前检查客户端状态

C# 在WCF中调用回调方法之前检查客户端状态,c#,wcf,wcf-data-services,wcf-client,wcf-callbacks,C#,Wcf,Wcf Data Services,Wcf Client,Wcf Callbacks,我有一个WCF服务和WCF客户端,使用netTCPBinding在双工通道上工作 我将连接的用户存储在字典中(字典) 当用户定期断开连接时,请致电断开服务连接,我会将该用户从已连接用户列表中删除。它很好用 但当客户端pc不规则地断开连接时,客户端无法调用断开连接的方法,所以客户端仍然在连接的用户列表中,这就是问题所在。因为当我的WCF服务器检查服务器是否有在线用户进行回调时,服务器尝试调用客户端的回调方法,但客户端不可用,我的WCF服务器应用程序崩溃 是否可以在调用回调实例之前检查客户端状态?确

我有一个WCF服务和WCF客户端,使用netTCPBinding在双工通道上工作

我将连接的用户存储在字典中(
字典

当用户定期断开连接时,请致电断开服务连接,我会将该用户从已连接用户列表中删除。它很好用

但当客户端pc不规则地断开连接时,客户端无法调用断开连接的方法,所以客户端仍然在连接的用户列表中,这就是问题所在。因为当我的WCF服务器检查服务器是否有在线用户进行回调时,服务器尝试调用客户端的回调方法,但客户端不可用,我的WCF服务器应用程序崩溃


是否可以在调用回调实例之前检查客户端状态?

确保所有属性超时设置为自动删除非活动客户端,然后在try-catch块中捕获超时异常并将其从字典中删除。

我通过以下方法解决此问题:

1.从客户端ping到服务器以使连接每30秒保持活动状态的方法

2.在服务器绑定上,接收超时时间为1分钟

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

确保所有属性超时设置为自动删除非活动客户端-抱歉,但我不知道如何做that@WaelGamal只需设置各种超时属性,然后将侦听器/发送器包装在try-catch块中以捕获超时exceptions@WaelGamal我有大约4个超时属性,它们中的哪一个负责从服务到客户端的回调?我找到了,它是ReliableSessions标记中的InactivityTimeout属性