HttpListener и порты - PullRequest
       21

HttpListener и порты

3 голосов
/ 21 февраля 2011

Я создаю HttpListener, пытаясь получить случайный открытый порт (или порт, который отсутствует в IpGlobalProperties.GetActiveTcpConnections ()).Проблема, с которой я сталкиваюсь, заключается в том, что через некоторое время, когда я выполняю эти соединения и избавляюсь от них, я получаю эту ошибку: 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);</p>

<pre><code>        if (!foundPort)
            throw new NoAvailablePortException();

        return httpListener;
    }

Ответы [ 3 ]

2 голосов
/ 21 февраля 2011

Вы пытались вызвать listener.Stop () перед Close ()?

Еще одна попытка - заключить код в блок using() {}, чтобы убедиться, что ваш объект расположен правильно.

Наконец, что вы делаете со слушателем (фрагмент кода может помочь)?Вы оставляете открытыми какие-либо потоки?

1 голос
/ 04 марта 2011

Это хакерский способ заставить HttpListener отменить регистрацию всех ваших префиксов, связанных с этим httpListener (здесь используются некоторые из моих пользовательских библиотек отражений, но основная идея та же)

<code>
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
}
0 голосов
/ 20 сентября 2017

Вам необходимо удалить префикс неудачного префикса перед добавлением нового, что намного проще, чем предложил Иисус Рамос.

httpListener.Prefixes.Remove(uriPref);
...