【问题标题】:Check client status before calling callback method in WCF在 WCF 中调用回调方法之前检查客户端状态
【发布时间】:2014-07-20 09:17:25
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 确保所有属性超时设置为自动删除非活动客户端 - 抱歉,我不知道该怎么做
    • @WaelGamal 只需设置各种超时属性,然后将您的侦听器/发送者包装在 try catch 块中以捕获超时异常
    • 我有大约4个超时属性,它们中的哪个负责从Service到Client的回调?
    • 我找到了,是 ReliableSessions 标签中的 InactivityTimeout 属性
    【解决方案2】:

    我解决了这个问题:

    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));
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      相关资源
      最近更新 更多