WCFサービスホストを使用してTCPポート61000で接続をリッスンするWindowsサービスがあります。サービスを開始しようとすると、次のエラーが発生します。
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 R2Standardで実行されています。
プログラムが閉じられたときにポートで開いている接続があり、TCPが4方向のクローズハンドシェイクを完了しなかった場合、ソケットはタイムアウトまで「半分閉じられた」ままになりますが期限切れになり(プログラムが終了した場合でも)、そのポートを再度開くことができなくなります。さまざまな実装には、通常1/2秒から2分の範囲のさまざまなタイムアウトがあります。