C# 进程终止时,WCF tcp连接保持打开状态

C# 进程终止时,WCF tcp连接保持打开状态,c#,wcf,tcp,C#,Wcf,Tcp,我在这里看到过类似的问题,但找不到答案。我有一个应用程序使用WCF打开到远程地址的连接,有时当我从任务管理器中关闭应用程序或应用程序不正常关闭时,连接保持打开状态,然后当我重新启动应用程序时,我收到一个异常,告诉我此端口上已经有侦听器 几个问题: 为什么在我终止进程后这些连接仍然保持打开状态 当进程不正常关闭时,如何关闭此连接 在尝试创建新连接之前,如何关闭连接 塞勒方面: var url = Config.GetRemoteServerUrl(); var binding = new NetT

我在这里看到过类似的问题,但找不到答案。我有一个应用程序使用WCF打开到远程地址的连接,有时当我从任务管理器中关闭应用程序或应用程序不正常关闭时,连接保持打开状态,然后当我重新启动应用程序时,我收到一个异常,告诉我此端口上已经有侦听器

几个问题:

  • 为什么在我终止进程后这些连接仍然保持打开状态
  • 当进程不正常关闭时,如何关闭此连接
  • 在尝试创建新连接之前,如何关闭连接
  • 塞勒方面:

    var url = Config.GetRemoteServerUrl();
    var binding = new NetTcpBinding();
    
    binding.Security.Mode = SecurityMode.None;
    binding.ReliableSession.Enabled = Config.RelaiableSession;
    binding.ReliableSession.InactivityTimeout = TimeSpan.MaxValue;
    binding.MaxConnections = Config.MaxConcurrentSessions;
    binding.ReaderQuotas.MaxArrayLength = Config.ReaderQuotasMaxArrayLength;
    binding.MaxReceivedMessageSize = Config.MaxReceivedMessageSize;
    binding.SendTimeout = new TimeSpan(0,0, 0, 0,Config.SendTimeout);
    binding.OpenTimeout = new TimeSpan(0,0, 0, 0,Config.OpenTimeout);
    
    host = new ServiceHost(ServerFacade.Instance, new Uri[] { new Uri(url) });
    
    host.AddServiceEndpoint(typeof(ITSOServiceContract), binding, url);
    
    host.Open();
    
    serverFacade = host.SingletonInstance as IServerFacade;
    

    您可以尝试添加Channel_Closed事件处理程序,并使用Abort()方法强制它进行处置

        OperationContext.Current.Channel.Closed += channelClosed;
    
    
        void Channel_Closed(object sender, EventArgs e)
        {
            var success = false;
            try
            {           
               proxy.Close();
               success = true;
            }
            finally
            {
              if (!success) proxy.Abort();           
            }
        }
    

    你能提供一些服务器端代码吗?我会试试,你知道为什么连接保持打开吗?@meirrav是自我主机的windows服务吗?@meirrav好吧,我想可能是TCP套接字模型的特定部分。在msdn中,有人说:“基于LingerState属性,在调用Close方法之后,TCP连接可能会保持打开状态一段时间,而数据仍有待发送。当底层连接完成关闭时,不会提供通知。”因此我假设NetTcpBinding遵循相同的行为