1

我试图让我的服务知道其中一个客户端何时断开连接。

我正在使用 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 事件触发没有任何问题......仍然不知道为什么但它有效。

4

2 回答 2

1

Closed事件应该在正常断开连接时发生;是这样吗?要检测纯套接字断开连接,请监听Faulted事件:

OperationContext.Current.Channel.Faulted += new EventHandler(FaultedHandler);
于 2013-06-04T16:05:35.953 回答
1

您遇到的问题可能是因为 WsDualHttpBinding。如果您有此绑定,则会创建两个连接,从客户端到服务以及从服务到客户端。

当应用程序通过 Internet 部署时,可能会在支持此类应用程序时产生一些问题,您需要确保人们不在防火墙或 NAT 等可能阻止您的服务连接回客户端的后面。

我仍然不知道为什么它在测试时不能在本地机器上运行,但我会尝试解决它并更新答案。

正如您在我们的聊天中告诉我的更多细节,从您的应用程序的性质来看,最好使用 NetTcpBinding。在这种情况下,由于创建了一个连接,因此更容易理解正在发生的事情,并且您将在客户端正常关闭或中止的情况下收到通知。

正如我之前告诉过你的,无论如何,最好创建一些心跳机制,以便在计算机或路由器意外关闭的情况下更可靠。

此外,您可以找到有关如何选择涉及 WCF 的各方之间通信的良好备忘单:

wcf 绑定备忘单

于 2013-06-04T20:07:55.023 回答