16

我有一个带有 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 方法,而在回调中跳过使用 Disconnect 方法。老实说,我不知道我更喜欢哪一个。嗯。

编辑

我选择了中止方法。这似乎是最合乎逻辑的方法,而且效果非常好。客户端收到回调实例上下文中的故障事件通知。好的。

4

2 回答 2

2

我选择了中止方法。这似乎是最合乎逻辑的方法,而且效果非常好。客户端收到回调实例上下文中的故障事件通知。

于 2013-10-22T11:24:06.353 回答
1

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

所以就在这行代码之前:

((ICommunicationObject)client.CallbackChannel).Close();
于 2011-03-02T17:32:23.007 回答