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

And*_*ita 16 wcf callback notify disconnect net.tcp

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

((ICommunicationObject)client.CallbackChannel).Close();
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我如何检测客户端已断开连接?

我已经在回调的InstanceContext和服务器的通道上连接到Closed和Faulted-events:

InstanceContext callback = new InstanceContext(callbackImp);
callback.Closed += new EventHandler(callback_Closed);
Run Code Online (Sandbox Code Playgroud)

((ICommunicationObject)Channel).Closed += new EventHandler(Channel_Closed);
Run Code Online (Sandbox Code Playgroud)

但没有任何作用.我从来没有收到通知.我现在使用的解决方法是在回调中使用一个方法来触发与客户端的断开连接.但我宁愿不这样做.我特别不想让服务器等待用户断开连接.

编辑

我刚刚意识到,当从客户端断开连接时,我在服务合同中运行一个标有IsTerminating = true的方法:

[OperationContract(IsTerminating = true)]
void Disconnect();
Run Code Online (Sandbox Code Playgroud)

我认为它在回调合约上会是一样的吗?我尝试将相同的方法添加到我的回调中,它确实从服务器的角度终止了回调通道,但我仍然没有收到客户端的通知......很奇怪

编辑

我发现了一些关于此的更多信息:

当服务器中止回调通道时,故障返回到客户端,客户端出现故障,我们在客户端上获得Faulted事件.

当服务器关闭回调通道时,会话仍处于打开状态,直到客户端发出关闭.

客户端关闭频道后,您将看到已关闭的事件.

根据这个声明,关闭事件不是通过从服务器关闭回调通道而大量触发的,客户端也必须关闭它.所以我可以在回调的终止Disconnect方法中在客户端上运行Close.或者我可以在回调服务器端使用Abort方法,并在回调上跳过使用Disconnect方法.我不知道哪一个我老老实实.Hmmmm.

编辑

我选择了Abort-approach.这似乎是最合乎逻辑的方法,而且效果非常好.客户端在callback-instancecontext上收到有关Faulted事件的通知.尼斯.

And*_*ita 2

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