我有一个带有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通知。好的。
https://stackoverflow.com/questions/4317754
复制相似问题