我的HttpListener
作为单独的线程托管在Windows服务中。我们使用的是.Net 4.6,客户端操作系统是Windows Server 2008 R2。在停止Windows服务之前,我已经停止并关闭了HttpListener
。我一直等到从我正在使用的端口中删除所有tcp连接。
有时候,当我尝试启动监听器时,HttpListener.Start
之后的行仍未执行。
while (i < 10)
{
try
{
System.Diagnostics.EventLog.WriteEntry(cs, $"Starting port {this.CurrentPort}", System.Diagnostics.EventLogEntryType.Information);
this.Listener.Start();
System.Diagnostics.EventLog.WriteEntry(cs, $"Started port {this.CurrentPort}", System.Diagnostics.EventLogEntryType.Information);
break;
}
catch (Exception ex)
{
System.Diagnostics.EventLog.WriteEntry(cs, ex.ToString(), System.Diagnostics.EventLogEntryType.Information);
retMessage.SetError(ex.ToString());
System.Threading.Thread.Sleep(5000);
}
i++;
}
这是我获取端口状态的方法:
private Dictionary<int, TcpState> AllPorts
{
get
{
var ports = new Dictionary<int, TcpState>();
IPGlobalProperties globalProperties = IPGlobalProperties.GetIPGlobalProperties();
var tcpNonListeningPorts = globalProperties.GetActiveTcpConnections();
var tcpListeningPorts = globalProperties.GetActiveTcpListeners();
foreach (var ipPort in tcpNonListeningPorts)
ports[ipPort.LocalEndPoint.Port] = ipPort.State;
foreach (var ipPort in tcpListeningPorts)
ports[ipPort.Port] = TcpState.Listen;
return ports;
}
}
只要端口存在于列表中,我就不会停止Windows服务。