wcf:如果服务器断开我的连接,如何检测客户端?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (21)

我有一个带有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();

我觉得在回调合同上它会是一样的呢?我尝试在我的回调中添加相同的方法,并且它从服务器的角度终止了回调通道,但我仍然没有在客户端收到通知......怪异的

我发现了更多关于这方面的信息:

当服务器中止回调通道时,故障返回到客户端,客户端发生故障,并且我们在客户端上收到Faulted事件。 当服务器关闭回调通道时,会话仍然处于打开状态,直到客户端发出关闭。 一旦客户关闭频道,您将看到Closed事件。

根据这条语句,关闭事件并不是通过关闭服务器的回调通道来触发的,客户端也必须关闭它。所以我可以在回调的终止Disconnect方法中在客户端运行Close。或者我可以在回调服务器端使用Abort-method,并在回调中使用Disconnect方法。我不知道我坦率地说哪一个。Hmmmm。

我采用了Abort方法。这似乎是最合乎逻辑的方法,它的运作非常好。客户端通过回调-conceptcontext上的Faulted事件得到通知。尼斯。

提问于
用户回答回答于

我采用了Abort方法。这似乎是最合乎逻辑的方法,它的运作非常好。客户端通过回调-conceptcontext上的Faulted事件得到通知。

用户回答回答于

可以在关闭回叫通道之前简单地进行回叫,告诉客户正在关闭通道。

所以就在这行代码之前:

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

扫码关注云+社区