System.Net.HttpListener в Windows 7 Ultimate x64 Ограничено до 1 КБ одновременных подключений - PullRequest
6 голосов
/ 10 ноября 2010

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

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

Заранее спасибо.GJ


Похоже, я немного подпрыгнул.

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

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

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

Спасибо
GJ

Ответы [ 2 ]

5 голосов
/ 16 ноября 2010

Я сделал так, чтобы поток, который прослушивает HttpListener, используя блокирующий метод GetContext(), но как только он получает запрос, передает его другому потоку, выполняя асинхронный вызов с использованием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);
        }
    }
0 голосов
/ 12 ноября 2010

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

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

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

...