首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在WCF中检测套接字断开连接

在WCF中检测套接字断开连接
EN

Stack Overflow用户
提问于 2011-03-17 20:12:30
回答 2查看 15.6K关注 0票数 18

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

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

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

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

提前感谢!

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-17 20:22:58

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

您应该监听Faulted事件

可以像往常一样从OperationContext.Current属性访问sessionId。

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

代码语言:javascript
复制
OperationContext.Current.Channel.Faulted += new EventHandler(Channel_Faulted);
OperationContext.Current.Channel.Closed += new EventHandler(Channel_Faulted);

和:

代码语言:javascript
复制
 void Channel_Faulted(object sender, EventArgs e)
 {
     Logout((IContextChannel)sender);
 }

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

        if (channel != null)
        {
            sessionId = channel.SessionId;
        }
      [...]
 }
票数 25
EN

Stack Overflow用户

发布于 2015-07-03 23:43:27

代码语言:javascript
复制
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;
                            });
                    }

                });
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5338842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档