我跟随托梅克·扬祖克(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();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top