我通过尝试获取一个打开的随机端口(或者不在IpGlobalProperties.GetActiveTcpConnections()中的端口)来创建HttpListener。我遇到的问题是,经过一段时间的连接并处理它们后,我收到此错误:No more memory is available for security information updates
有没有办法解决这个问题,或者是否有正确的方法来摆脱HttpListeners。我只是在调用listener.Close()。
以下是用于创建侦听器的方法:
private HttpListener CreateListener()
{
HttpListener httpListener;
DateTime timeout = DateTime.Now.AddSeconds(30);
bool foundPort = false;
do
{
httpListener = new HttpListener();
Port = GetAvailablePort();
string uriPref = string.Format("http://{0}:{1}/", Environment.MachineName.ToLower(), Port);
httpListener.Prefixes.Add(uriPref);
try
{
httpListener.Start();
foundPort = true;
break;
}
catch
{
httpListener.Close();
FailedPorts.Add(Port);
}
} while (DateTime.Now < timeout);
if (!foundPort)
throw new NoAvailablePortException();
return httpListener;
}
答案 0 :(得分:2)
您是否尝试在Close()之前调用listener.Stop()?
要尝试的另一件事是将代码包装在using() {}
块中,以确保正确放置对象。
最后,您在使用监听器做什么(代码片段可能有帮助)?你是否打开任何溪流?
答案 1 :(得分:1)
这是强制HttpListener取消注册与该httpListener关联的所有前缀的hackish方式(这使用了我的一些自定义反射库,但基本思路是相同的)
private void StopListening()
{
Reflection.ReflectionHelper.InvokeMethod(httpListener, "RemoveAll", new object[] {false});
httpListener.Close();
pendingRequestQueue.Clear(); //this is something we use but just in case you have some requests clear them
}
答案 2 :(得分:0)
你需要在添加新的前缀之前删除失败的前缀,这比耶稣拉莫斯提出的要简单得多。
httpListener.Prefixes.Remove(uriPref);
答案 3 :(得分:-1)
这是强行阻止Httplistener
httpListener.Prefixes.Remove(uriPref);