サーバー上に Windows サービスとして展開されている WCF サービスがあります。回復時に自動的に再起動するように構成されています (Services.msc ユーティリティのサービスの [プロパティ] ダイアログで)。ただし、サービスが自動再起動すると、次の例外がスローされます。
System.ServiceModel.AddressAlreadyInUseException: IP エンドポイント 0.0.0.0:8093 には既にリスナーがあります。アプリケーションでこのエンドポイントを複数回使用しようとしていないこと、およびこのエンドポイントでリッスンしている他のアプリケーションがないことを確認してください。
まだ起動していますが、障害のある状態です。手動で再起動すると、このエラーは発生しません (サービスが障害状態で再起動した後にサービスを停止しようとすると、警告が表示されます)。
サービスの再起動が速すぎて、サービス マネージャーは、そのポートでリッスンしている別のサービスがまだあると考えているようです。5 分後にサービスを再起動するように構成しました。また、コマンド ラインでnetstat -a -n -oを実行して、そのポートの唯一のサービスが自分のものであることを確認しました。
プロキシは、次のようにサービスを中止しようとします。
public byte[] ConvertDocument(ConversionType conversionType, byte[] documentData)
{
byte[] result = null;
IDocumentConverter server = this.channelFactory.CreateChannel();
try
{
((ICommunicationObject)server).Open();
result = server.ConvertDocument(conversionType, documentData);
((ICommunicationObject)server).Close();
}
finally
{
if (((ICommunicationObject)server).State != CommunicationState.Closed)
((ICommunicationObject)server).Abort();
}
return result;
}
他の誰かがこの種の問題を抱えていますか?
アップデート:
InstanceContextMode を PerSession および Single に変更した後でも、この問題は解決していません。
クライアントがポートで接続を維持しているかどうか疑問に思っているので、サービスが再起動すると、ポートは既に使用されていると見なされます。
クライアントの実装方法が AddressAlreadyInUseException の原因になっている可能性はありますか? OperationContract で CommunicationException を飲み込む、または OperationContract への呼び出しごとにチャネルを作成して開くなど。