HttpListeners和端口

时间:2011-02-21 20:18:08

标签: c# .net exception httplistener

我通过尝试获取一个打开的随机端口(或者不在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;
    }

4 个答案:

答案 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);