HttpListener поддерживает внутреннюю очередь ожидающих соединений, поэтому простое «непринятие соединения» здесь не поможет, вам нужно очистить его очередь.Это может управляться с помощью пула потоков (.NET <= 4.0) или с помощью асинхронных соединений (4.5 +). </p>
Примером подхода «пул потоков + очередь» является Grapevine .В моей ветке исследований и разработок Interpspecific я улучшил это, чтобы ограничить количество ожидающих запросов.Он очищает очередь HttpListener и отклоняет запросы с 500 ошибками, если очередь заполнена.Начиная с RESTServer.c :
private void HandleRequests()
{
// Immediately accept and handle any requests:
while (this.IsListening)
{
try
{
var context = this._listener.GetContext();
this.QueueRequest(context);
}
catch (Exception e)
{
EventLogger.Log(e);
}
}
}
private void QueueRequest(HttpListenerContext context)
{
lock (this._queue)
{
if (_queue.Count > MaxPendingRequests)
{
context.Response.StatusCode = 503;
context.Response.OutputStream.Close();
context.Response.Close();
EventLogger.Log(
String.Format( "Request queue max size reached: {0}. Connection refused with 503 error.",
MaxPendingRequests ) );
return;
}
this._queue.Enqueue(context);
this._ready.Set();
}
}
Это ограничивает общее количество подключений к MaxPendingRequests + количество потоков, извлекающих подключения из очереди.Потоки Hanlder вытаскивают из очереди (оставлены в качестве упражнения для читателя или см. RESTServer.c для примеров).
Цикл принятия и предел подключения будут другими, если вы используете асинхронный подход (гораздо более масштабируемый)но только 4.5+), но общая идея та же: немедленно принять HttpListenerContexts и вернуть 500, если вы «слишком заняты».