在WCF中调用回调方法之前检查客户端状态
本文关键字:检查 客户端 状态 方法 WCF 调用 回调 | 更新日期: 2023-09-27 18:13:37
我有一个WCF服务和WCF客户端使用netttcpbinding在双工通道上工作。
我将连接的用户存储在字典(Dictionary<int userID,CallbackInstance instance>
)
当用户定期断开连接时,呼叫断开服务,然后我将该用户从已连接用户列表中删除。
但是当客户端pc不定期断开连接时,客户端无法调用Disconnect方法,因此客户端仍在已连接的用户列表中,这就是问题所在。因为当我的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));
}
}