我有一个 WCF 服务,它部署为服务器上的 Windows 服务。它配置为在恢复时自动重新启动(在 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 时创建并打开通道。