首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如果服务器断开连接,如何检测客户端?

如果服务器断开连接,如何检测客户端?
EN

Stack Overflow用户
提问于 2010-12-01 03:38:58
回答 2查看 8.7K关注 0票数 16

我有一个带有net.tcp DuplexChannel的WCF自托管服务。在服务器上,我运行以下命令来断开客户端的连接:

((ICommunicationObject)client.CallbackChannel).Close();

这可以很好地工作,但是我如何在客户机上检测到它已经断开?

我连接了Closed和Faulted在回调的InstanceContext和到服务器的通道上的事件:

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

我想回调合同上应该是一样的吧?我尝试将相同的方法添加到我的回调中,但从服务器的角度来看,它确实终止了回调通道,但我仍然没有收到客户端的通知……奇怪

编辑

我找到了更多关于这方面的信息:

当服务器中止回调通道时,故障返回到客户端,客户端发生故障,我们在客户端上获得故障事件。

当服务器关闭回调通道时,在客户端发出close之前,会话仍处于打开状态。

一旦客户端关闭通道,您将看到Closed事件。

根据这条语句,关闭事件并不是通过关闭来自服务器的回调通道来触发的,客户端也必须关闭它。因此,我可以在回调的终止Disconnect-method中运行Close。或者,我可以在回调服务器端使用Abort-method,而跳过在回调上使用Disconnect-method。老实说,我不知道我更喜欢哪一个。嗯。

编辑

我选择了中止方法。这似乎是最合乎逻辑的方法,而且效果很好。客户端收到callback-instancecontext上的Faulted-event通知。好的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-22 19:24:06

我选择了中止方法。这似乎是最合乎逻辑的方法,而且效果很好。客户端收到callback-instancecontext上的Faulted-event通知。

票数 2
EN

Stack Overflow用户

发布于 2011-03-03 01:32:23

你可以在关闭回调通道之前做一个回调,告诉客户端你正在关闭通道。

所以就在这行代码之前:

((ICommunicationObject)client.CallbackChannel).Close();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4317754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档