如何修复打开服务主机时发生的 AddressInUseException

How to fix AddressInUseException that occurs whenever service host is opened

我正在处理 WCF windows 应用程序...在重新启动服务时,出现以下异常。

outerType: System.ServiceModel.AddressAlreadyInUseException
outerMessage: "Cannot listen on pipe name 'net.pipe://0.0.0.1/MyService' because another pipe endpoint is already listening on that name."
type: System.IO.PipeException

App.Config 文件:

<services>
  <service name="ServiceName">
    <endpoint address="" binding="netNamedPipeBinding" contract="ServiceClient">
    </endpoint>
    <host>
      <baseAddresses>
        <add baseAddress="net.pipe://0.0.0.1/MyService"/>
      </baseAddresses>
    </host>
  </service>
</services>

启动方式:

public void Start(string serviceName)
    {
        _serviceName = serviceName;
        if (_serviceController == null)
        {
            _serviceController = new ServiceController(_serviceName);
        }

            TimeSpan timeout;
            switch (_serviceController.Status)
            {
                case ServiceControllerStatus.Stopped:
                    _serviceController.Start();
                    timeout = TimeSpan.FromMilliseconds(60000);
                    _serviceController.WaitForStatus(ServiceControllerStatus.Running, timeout);
                    break;
                case ServiceControllerStatus.Paused:
                    _serviceController.Continue();
                    timeout = TimeSpan.FromMilliseconds(60000);
                    _serviceController.WaitForStatus(ServiceControllerStatus.Running, timeout);
                    break;
            }
    }

停止方法:

public void Stop()
    {
            if (_serviceController == null)
            {
                _serviceController = new ServiceController(_serviceName);
            }
            if (_serviceController.Status == ServiceControllerStatus.Running)
            {
                _serviceController.Stop();
                TimeSpan timeout = TimeSpan.FromMilliseconds(20000);
                _serviceController.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
            }
    }

每当我重新启动我的服务时,我都会启动我的服务控制器并打开一个服务主机来托管我的服务。

_serverHost = new ServiceHost(this); // this points my service name mentioned in App.Config
_serverHost.Open(); // Exception occurs here. 

我尝试在两种 Stop() 方法上增加 WaitForStatus() 的超时时间,但没有成功。 任何建议都会有很大的帮助。

谢谢。

由于您只是 post window NT 服务的管理应用程序,我认为这方面的任何更改都无济于事。
Windows NT服务代码设计是什么?在我看来,我们应该在windows服务OnStart事件和windows服务OnStop事件中正确打开和关闭服务宿主。 Windows NT 服务是问题的根源。
另外,我建议在开启服务主机和停止服务主机时加入IF语句检测。
请考虑以下代码。

public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }
        Uri uri = new Uri("net.pipe://localhost/mypipe");
        ServiceHost sh = null;

        protected override void OnStart(string[] args)
        {
            NetNamedPipeBinding binding = new NetNamedPipeBinding();
            try
            {
if (sh == null)
                {
                    sh = new ServiceHost(typeof(MyService), uri);
                    sh.Open();
                }            }
            catch (Exception e)
            {
            }

        }

        protected override void OnStop()
        {
            if (sh != null && sh.State == CommunicationState.Opened)
            {
                sh.Close();
            }
        }

如果问题仍然存在,请随时告诉我。