WCF TCP连接在进程被终止后保持打开状态

5
我看到类似的问题,但找不到答案。我有一个使用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;

你能提供一些服务器端的代码吗? - Alex
1个回答

0
你可以尝试添加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
@meirrav 这是自托管的 Windows 服务吗? - Alex
@meirrav 嗯,我想这可能与TCP套接字模型有关。在MSDN中,它说:“根据LingerState属性,当仍有数据需要发送时,在调用Close方法后,TCP连接可能会保持打开状态。在底层连接完成关闭时不提供任何通知。” http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.close.aspx 所以我想NetTcpBinding遵循相同的行为。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接