我有一个 Windows 服务,它使用 WCF 服务主机侦听 TCP 端口 61000 上的连接。当我尝试启动该服务时,出现错误:
Service cannot be started. System.ServiceModel.AddressAlreadyInUseException: HTTP could not register URL http://+:61000/ because TCP port 61000 is being used by another application. ---> System.Net.HttpListenerException: The process cannot access the file because it is being used by another process
at System.Net.HttpListener.AddAll()
at System.Net.HttpListener.Start()
at System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen()
--- End of inner exception stack trace ---
at System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen()
at System.ServiceModel.Channels.TransportManager.Open(TransportChannelListener channelListener)
at System.ServiceModel.Channels.TransportManagerContainer.Open(SelectTransportManagersCallback selectTransportManagerCallback)
at System.ServiceModel.Channels.HttpChannelListener.OnOpen(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
at System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout)
at...
快速netstat -a
显示端口 61000 上没有任何内容在监听。我还在网上找到了几篇帖子,提到使用以下方式保留命名空间netstat
,但服务运行的帐户具有管理员权限,因此这不是必要的。
关于我为什么收到此消息还有其他想法吗?
此服务在 64 位 Windows Server 2008 R2 Standard 上运行。
答案1
如果程序关闭时端口上有打开的连接,并且 TCP 未完成 4 次关闭握手,则套接字将保持“半关闭”状态,直到超时到期(即使程序已终止),并会阻止您再次打开该端口。各种实现的超时时间不同,通常范围从 1/2 秒到 2 分钟。