如何修复打开服务主机时发生的 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();
}
}
如果问题仍然存在,请随时告诉我。
我正在处理 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();
}
}
如果问题仍然存在,请随时告诉我。