我正在尝试让我的服务知道其中一个客户端何时断开连接。
我正在使用wsDualHttpBinding。
目前,我尝试使用此活动:
OperationContext.Current.Channel.Closed += new EventHandler((sender, e) => ClientIsDisconnected(sender, e, currentCallbackChannel));
但这件事永远不会被解雇......
请帮助我知道它是如何完成的!
编辑:
感谢anderhil,我终于通过netTcpBinding替换了wsDualHttpBinding(使用此处描述的适当配置:http://msdn.microsoft.com/en-us/library/ff647180.aspx#Step1)。
使用netTcpBinding,Closed事件会毫无问题地触发......仍然不知道为什么但它有效。
答案 0 :(得分:1)
Closed
事件应该在正常断开时发生;那是怎么回事?
要检测纯套接字断开连接,请侦听Faulted
事件:
OperationContext.Current.Channel.Faulted += new EventHandler(FaultedHandler);
答案 1 :(得分:1)
您遇到的问题很可能是因为WsDualHttpBinding。如果您具有此绑定,则会创建两个连接,从客户端到服务以及从服务到客户端。
当通过互联网部署应用程序时,它可能会产生支持此类应用程序的一些问题,您需要确保人员不在防火墙或NAT等之后,这可能会阻止您的服务连接回客户端。
我仍然不知道为什么它在测试时无法在本地机器上运行,但我会尝试解决它并更新答案。
正如您在聊天中告诉我更多细节,从应用程序的性质来看,最好使用NetTcpBinding。在这种情况下,更容易理解导致创建一个连接的情况,并且您将在Gracefull关闭或中止客户端时收到通知。
正如我之前告诉过你的那样,无论如何最好创建一些心跳机制,以便在意外的计算机或路由器关闭时让事情更可靠。
此外,您可以找到关于如何选择涉及WCF的各方之间的沟通的好的备忘单: