如何在WCF服务上检测到客户端刚刚断开连接?

时间:2018-09-12 21:20:37

标签: c# wcf

我正在按如下方式处理通道故障和关闭事件

 [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
                    ConcurrencyMode = ConcurrencyMode.Multiple,
                    UseSynchronizationContext = false)]

 OperationContext.Current.Channel.Faulted += Channel_Faulted;
 OperationContext.Current.Channel.Closed += Channel_Closed;

 private void Channel_Faulted(object sender, EventArgs e)
 {
       //perform Something
 }

 private void Channel_Closed(object sender, EventArgs e)
 {
        //perform Something
 }

绑定信息如下。

NetTcpBinding tcpBinding = new NetTcpBinding(SecurityMode.None, true);
tcpBinding.ReceiveTimeout = new TimeSpan(48, 0, 0);
tcpBinding.ReliableSession.Enabled = true;
tcpBinding.ReliableSession.InactivityTimeout = new TimeSpan(0, 0, 10);

当我通过关闭/中止代理来优雅地结束客户端时,事件处理程序就会被命中,但是当我通过任务管理器终止客户端进程或关闭正在运行客户端的系统时,事件处理程序不会被调用。我在这里做错了什么?谢谢任何处理这种情况的代码示例。

1 个答案:

答案 0 :(得分:0)

这是XY问题吗?如果您的服务实例PerCall没关系,因为对于该服务的每个方法调用,连接都会打开和关闭。

服务故障仅是由于使用WCF导管而发生的。终止进程将切断基础的TCP连接。除非您的服务器正在使用该通道,否则不会出错。

我通常希望对我的每个会话 WCF服务进行的操作是将它们标记为IDisposable,然后处理Dispose中的所有清理任务,而无需进行正常终止。