如果服务器断开我的连接,如何检测客户端?
Posted
技术标签:
【中文标题】如果服务器断开我的连接,如何检测客户端?【英文标题】:How to detect client-side if the server disconnects me? 【发布时间】:2011-05-18 02:15:53 【问题描述】:我有一个带有 net.tcp DuplexChannel 的 WCF 自托管服务。在服务器上,我运行以下命令来断开客户端:
((ICommunicationObject)client.CallbackChannel).Close();
这工作正常,但我如何在客户端上检测到它已断开连接?
我已经在回调的 InstanceContext 和服务器通道上连接了 Closed 和 Faulted-events:
InstanceContext callback = new InstanceContext(callbackImp);
callback.Closed += new EventHandler(callback_Closed);
和
((ICommunicationObject)Channel).Closed += new EventHandler(Channel_Closed);
但是没有任何效果。我从来没有收到通知。我现在使用的解决方法是在回调中有一个方法来触发与客户端的断开连接。但我宁愿不这样做。我特别不想让服务器等待用户断开连接。
编辑
我刚刚意识到,当与客户端断开连接时,我在服务合同中运行了一个标有 IsTerminating = true 的方法:
[OperationContract(IsTerminating = true)]
void Disconnect();
我认为回调合同会是一样的吗?我尝试将相同的方法添加到我的回调中,它确实从服务器的角度终止了回调通道,但我仍然没有在客户端收到通知......奇怪
编辑
我发现了一些关于此的更多信息:
当服务器中止回调时 通道,故障传播回 客户,客户故障,我们得到 客户端上的故障事件。
当服务器关闭回调时 频道,会话仍处于打开状态 直到客户发出关闭。
一旦客户端关闭频道 你会看到 Closed 事件。
根据该语句,关闭事件不会通过关闭服务器的回调通道来触发,客户端也必须关闭它。所以我可以在回调的终止 Disconnect 方法中在客户端上运行 Close。或者我可以在回调服务器端使用 Abort 方法,并在回调中跳过使用 Disconnect 方法。老实说,我不知道我更喜欢哪一个。嗯。
编辑
我选择了中止方法。这似乎是最合乎逻辑的方法,而且效果非常好。客户端收到回调实例上下文中的故障事件通知。不错。
【问题讨论】:
看看这个我有同样的问题***.com/questions/3986347/… 【参考方案1】:我选择了中止方法。这似乎是最合乎逻辑的方法,而且效果非常好。客户端在回调实例上下文中收到故障事件通知。
【讨论】:
【参考方案2】:您可以在关闭回调通道之前简单地进行回调,告诉客户端您正在关闭通道。
所以就在这行代码之前:
((ICommunicationObject)client.CallbackChannel).Close();
【讨论】:
如何提供一些关于什么不起作用的更多细节......我知道它可以工作,因为那里有一些 prod 软件使用回调通道运行代码。不记得 6 年前的确切实施,但恕我直言,只是说它不起作用并且对答案投反对票有点幼稚。 问题中的编辑解释了它,关闭回调不会通知客户端。您必须中止它,以便客户端接收故障事件。以上是关于如果服务器断开我的连接,如何检测客户端?的主要内容,如果未能解决你的问题,请参考以下文章
socket编程中,服务器如何检测到客户端网络连接的断开.比如说客户端的网线断掉了,从服务端如何能检测到呢l