如何检测双链双链投票客户
-
30-09-2019 - |
题
我跟随托梅克·扬祖克(Tomek Janczuk)的 使用HTTP轮询双工WCF通道的酒吧/子样本 但是我注意到,当客户端通过关闭浏览器断开连接时,服务不会在下一个回调中注意到。我本来希望一个例外,或者说终点不再存在。
您怎么知道客户何时消失,以便停止向该客户发布?
解决方案
似乎有一个不令人满意的,尽管简单的解决方案:如果客户端回调时间,请不要再调用。
在我的系统中,我还实施了手册“检查”调用 - 每一个 n 秒,服务器通过每个注册客户端的回调频道调用无参数方法,只是查看客户端是否仍在那里。我开始怀疑这是否真的是个好主意 - 我遇到了一个新问题,因为我已经将客户暂停在调试器中,因此回调超时会不断发生。
其他提示
确定知道: 不可能的.
当关闭TCP连接(基础HTTP调用)时,将发送特殊的TCP消息发送到服务器-FIN数据包。尽管HTTP是无状态的,但基本的TCP连接是陈述的,并且保持生命,基础TCP连接通常保持开放。如果客户端处置,则关闭TCP连接,通常是发送到服务器的消息。但是,如果它崩溃或网络已断开连接,那将没有时间做到这一点。因此,一个词,您永远无法确定。
这里 有关更多信息。
它很难,几乎不可能 (有限的SL双链体功能的原因)。我们已经在服务中实现了一个用户列表,并添加了一个“ ISDisconted”和LastCommunication Time的属性,一旦WCF服务尝试在用户的传出消息中添加消息时就会超时,并且会失败,并抛出异常例外超时。我们标记“ isDisconnecte = true”,下次不要尝试将消息发送给该用户。
另一个线程不断查看它,如果注意到最后一个通信时间已经超过了时间的值,并且isDisconnected = true,它将从列表中删除用户,除非同一用户尝试在此时间段内再次连接(我们是我们的)通过其用户识别)。
我们手动做了很多事情来解决这个问题,因为它使WCF服务非常忙。
我面对这个问题,并创建了一个线程,该线程通过以下代码删除了断开的客户端。它可以正常工作,但在10-15分钟后将断开的客户端从客户端列表中删除(对我来说是可以的)。
new Thread(new ThreadStart(() =>
{
while (SilverlightClients != null)
{
lock (SilverlightClients)
{
SilverlightClients = SilverlightClients.Where(d => (d.Callback as IContextChannel).State != CommunicationState.Opened).ToList();
}
Thread.Sleep(1000);
}
})) { Name = "Thread Remove Disconnected Clients" }.Start();