System.net.htttplistener на Windows 7 Ultimate X64 ограничен 1K одновременных соединений
-
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!