1

我有一个 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 时创建并打开通道。

4

0 回答 0