如何检测WCF中的套接字断开?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

我们正在构建一个WCF服务器(.NET 4.0)。它只会使用net.tcp传输。

当客户端关闭TCP连接时,服务器将得到未处理的CommunicationException并终止。

Q1。如何处理CommunicationException,以便服务器不终止并继续为其他客户端服务?

Q2。在处理程序中,如何获取已中止的会话的SessionId?我需要这个来清理一些会话特定的数据。

PS连接通过Internet进行,因此无论客户端是否正常断开连接,套接字都可以随时关闭。

提问于
用户回答回答于

任何WCF通道都实现了ICommunicationObject,它为通道生命周期提供事件。

你应该听Faulted事件

sessionId可以像OperationContext.Current属性一样被访问。

当客户打开频道时(在第一次操作时),注册适当的事件:

OperationContext.Current.Channel.Faulted += new EventHandler(Channel_Faulted);
OperationContext.Current.Channel.Closed += new EventHandler(Channel_Faulted);

和:

 void Channel_Faulted(object sender, EventArgs e)
 {
     Logout((IContextChannel)sender);
 }

 protected void Logout(IContextChannel channel)
 {
        string sessionId = null;

        if (channel != null)
        {
            sessionId = channel.SessionId;
        }
      [...]
 }
用户回答回答于
ICommunicationObject obj = (ICommunicationObject)callback;
                obj.Closed += new EventHandler((a, b) => 
                {
                    if (list.Exists(cli => cli.CallbackService == (ITecnobelRemoteServiceCallback)a))
                    {
                        var query = (from cc in list where cc.CallbackService == (ITecnobelRemoteServiceCallback)a select cc).ToList();
                        query.ForEach(
                            delegate (Client ccc)
                            {
                                ccc.CallbackService = null;
                            });
                    }

                });

扫码关注云+社区