System.net.htttplistener на Windows 7 Ultimate X64 ограничен 1K одновременных соединений

StackOverflow https://stackoverflow.com/questions/4145297

  •  30-09-2019
  •  | 
  •  

Вопрос

Я пытался сделать некоторое тестирование с http.sys / httplistener на моей рабочей станции, и, похоже, в месте существует некоторая лимит, который предотвращает больше, что 1000 одновременных соединений. У кого-нибудь есть дополнительная информация об этом? (Как 1к, кажется, немного очистить, чтобы быть совпадением).

Я пытался найти нить / настройку конфигурации / реестра, но придумал пустым.

Заранее спасибо.
Гьи


Похоже, я немного прыгнул в пистолет.

Кажется, я пропустил, что используя http.sys / httplistener begingetcontext не очень хорош для одновременных соединений, поскольку новый BegingEttcontext будет только пожарнуть после того, как поток ответа от предыдущего запроса закрыл.

Таким образом, есть отставание 1000 запросов, и в этом случае заполнение отставания.

Во всяком случае - если у кого-то есть какие-либо комментарии (или вероятные исправления), не стесняйтесь расширяться.

Спасибо
Гьи

Это было полезно?

Решение

То, как я сделал это, это иметь нить, которая слушает на HttpListener используя блокировку GetContext() метод, но как только он получает запрос, передает его другому потоку, выполняя async, используя IAsyncResult Узор, и это, кажется, работает нормально.

    private void Run()
    {
        while (true)
        {
            if (this._disposed || this._shouldTerminate) return;

            if (this._listener.IsListening)
            {
                try
                {
                    HttpListenerContext context = this._listener.GetContext();

                    //Hand it off to be processed asynchronously
                    this._delegate.BeginInvoke(context, new AsyncCallback(this.EndRequest), null);
                }
                catch (Exception ex)
                {
                    this.LogErrors(ex);
                }
            }
        }
    }

    private delegate HttpServerContext HandleRequestDelegate(HttpListenerContext context);

    private HttpServerContext HandleRequest(HttpListenerContext context)
    {
        IHttpListenerHandler handler;
        HttpServerContext serverContext = new HttpServerContext(this, context);
        try
        {
            bool skipHandling = this.ApplyPreRequestModules(serverContext);
            if (!skipHandling)
            {
                handler = this._handlers.GetHandler(serverContext);
                handler.ProcessRequest(serverContext);
            }
        }
        catch (NoHandlerException noHandlerEx)
        {
            this.LogErrors(noHandlerEx);
            context.Response.StatusCode = (int)HttpStatusCode.MethodNotAllowed;
        }
        catch (HttpServerException serverEx)
        {
            this.LogErrors(serverEx);
            context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
        }

        return serverContext;
    }

    private void EndRequest(IAsyncResult result)
    {
        try
        {
            HttpServerContext context = this._delegate.EndInvoke(result);
            this.ApplyPreResponseModules(context);
            context.Response.Close();
        }
        catch (Exception ex)
        {
            this.LogErrors(ex);
        }
    }

Другие советы

Вот упрощенный подход к поддержке нескольких одновременных запросов с httplistener.

        for (int i = 0; i < 50; i++) {
            _listener.BeginGetContext(GetContextCallback, null);
        }

Теперь это позволит вам получать 50 одновременных запросов. Должен признаться, я никогда не пытался создать 1000!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top