0

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

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

当用户定期断开连接时,请从服务中调用断开连接,然后我将用户从连接的用户列表中删除。它工作正常。

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

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

4

2 回答 2

0

我用以下方法解决了这个问题:

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

2.服务器绑定时,ReceiveTimeout 为 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));
        }
    }
于 2014-08-05T15:53:25.940 回答
0

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

于 2014-07-20T11:49:03.407 回答