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

本文关键字:检查 客户端 状态 方法 WCF 调用 回调 | 更新日期: 2023-09-27 18:13:37

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

我将连接的用户存储在字典(Dictionary<int userID,CallbackInstance instance>)

当用户定期断开连接时,呼叫断开服务,然后我将该用户从已连接用户列表中删除。

但是当客户端pc不定期断开连接时,客户端无法调用Disconnect方法,因此客户端仍在已连接的用户列表中,这就是问题所在。因为当我的WCF服务器检查服务器的在线用户回调时,服务器尝试调用客户端的回调方法,但客户端不可用,并且我的WCF服务器应用程序崩溃。

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

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

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

我修改了:

1。方法从客户端ping到服务器,以保持连接每30秒活动一次。

2。在服务器绑定上,ReceiveTimeout为1分钟。

3。Foreach回调创建了一个iccommunicationobject,使用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));
        }
    }