我有一个带有net.tcp DuplexChannel的WCF自托管服务。在服务器上,我运行以下命令断开客户端连接:
((ICommunicationObject)client.CallbackChannel).Close();
这很好但是如何在客户端上检测到它已断开连接?
我已经在回调的InstanceContext和服务器的通道上连接了Closed和Faulted事件:
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事件。
当服务器关闭回调时 频道,会话仍然开放 直到客户发出结束。
客户关闭频道后 你会看到封闭的事件。
根据此声明,关闭事件不会通过从服务器关闭回调通道而大量触发,客户端也必须关闭它。所以我可以在回调的终止Disconnect方法中在客户端上运行Close。或者我可以在回调服务器端使用Abort方法,并在回调上跳过使用Disconnect方法。我不知道哪一个我老老实实。 Hmmmm。
修改
我选择了Abort-approach。这似乎是最合乎逻辑的方法,而且效果非常好。客户端在callback-instancecontext上收到有关Faulted事件的通知。好的。
答案 0 :(得分:2)
我选择了Abort-approach。这似乎是最合乎逻辑的方法,而且效果非常好。客户端会在callback-instancecontext上收到有关Faulted事件的通知。
答案 1 :(得分:1)
您可以在关闭回调频道之前简单地进行回调,告诉客户您正在关闭频道。
就在这行代码之前:
((ICommunicationObject)client.CallbackChannel).Close();