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

时间:2014-07-20 09:17:25

标签: c# wcf wcf-data-services wcf-client wcf-callbacks

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

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

当用户定期断开连接时,请致电Disconnect from service,然后从连接的用户列表中删除该用户。它工作正常。

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我解决了这个问题:

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

2.On服务器绑定,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));
        }
    }