【问题标题】:WCF tcp connections stay open when process is killed当进程被杀死时,WCF tcp 连接保持打开状态
【发布时间】:2013-03-10 16:56:30
【问题描述】:

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

几个问题:

  1. 为什么在我终止进程后此类连接仍保持打开状态?
  2. 当进程不正常关闭时如何关闭此连接?
  3. 如何在尝试创建新连接之前关闭连接?

服务端:

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;

【问题讨论】:

  • 能否提供一些服务器端代码

标签: c# wcf tcp


【解决方案1】:

您可以尝试添加 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 Socket 模型的特殊性。在 msdn 中说:“基于 LingerState 属性,当数据仍有待发送时,调用 Close 方法后 TCP 连接可能会保持打开状态。当底层连接完成关闭时,不会提供任何通知。” msdn.microsoft.com/en-us/library/… 所以我想 NetTcpBinding 遵循相同的行为
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 2017-06-02
  • 2013-01-02
  • 1970-01-01
  • 2012-09-20
相关资源
最近更新 更多