我有一个使用netTCPBinding处理双工通道的WCF服务和WCF客户端。
我将连接的用户存储在字典(Dictionary<int userID,CallbackInstance instance>
)
当用户定期断开连接时,请致电Disconnect from service,然后从连接的用户列表中删除该用户。它工作正常。
但是当客户端pc断开连接时,客户端无法调用Disconnect方法,因此客户端仍处于连接用户列表中,这就是问题所在。因为当我的WCF服务器为在线用户检查服务器以进行回调时,服务器会尝试调用客户端的回调方法,但客户端不可用,并且我的WCF服务器应用程序崩溃。
在调用回调实例之前是否可以检查客户端状态?
答案 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));
}
}