Проблема HttpWebRequest: в системе не хватило места в буфере или из-за переполнения очереди

Я использую службу для получения списка отелей в виде XML-документа. Все это отлично работает на нашем сервере разработки при тестировании, однако вскоре после развертывания все страницы, использующие это, не работают и отображают эту ошибку:

An operation on a socket could not be performed because the system lacked
sufficient buffer space or because a queue was full 91.103.175.187:80

Description: An unhandled exception occurred during the execution of the current
web request. Please review the stack trace for more information about the error
and where it originated in the code. 

Exception Details: System.Net.Sockets.SocketException: An operation on a socket
could not be performed because the system lacked sufficient buffer space or
because a queue was full 91.103.175.187:80

Stack Trace: 

[SocketException (0x2747): An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full 91.103.175.187:80]
   System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress) +305
   System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Int32 timeout, Exception& exception) +699

[WebException: Unable to connect to the remote server]
System.Net.HttpWebRequest.GetResponse() +7859156
Laterooms.Gateway.LateroomsGateway.GetHotelsWithurl(String url)
Laterooms.Gateway.LateroomsGateway.GetHotelsByKeyword(String keyword, String orderBy) 
Laterooms.LateroomsManager.GetHotelsByKeyword(String keyword, String orderBy, String lang)

Увидев это, я подумал, что это может быть связано с количеством выполняемых запросов, поэтому я реализовал кэширование, но все же возникают те же проблемы. Вот код, который я использую для получения данных:

    HttpWebRequest request = null;

    Uri uri = new Uri(url);
    request = (HttpWebRequest)WebRequest.Create(uri);
    request.Method = "POST";
    request.AllowWriteStreamBuffering = false;
    request.ContentLength = 0;
    request.KeepAlive = false;

    using (WebResponse response = request.GetResponse())
    {
        using (Stream dataStream = response.GetResponseStream())
        {
            _LateroomsXml.Load(dataStream);
        }
    }

Опять же, эта проблема возникает только на нашем действующем сервере. После многих часов отладки и гугления я так и не приблизился к решению этой проблемы.

Любая помощь по этому вопросу будет принята с благодарностью!


person shoughton123    schedule 18.06.2013    source источник
comment
какая виртуальная память назначена для live box - у меня была очень похожая проблема, вызванная нехваткой виртуальной памяти, хотя на самом сервере было много стандартной памяти   -  person Johnv2020    schedule 18.06.2013
comment
Ему выделено 4 ГБ, на данный момент он работает только на 2 ГБ. Я думал, что это может быть проблемой, но, похоже, это не так.   -  person shoughton123    schedule 18.06.2013


Ответы (2)


Пожалуйста, не используйте это исправление. Ваша проблема в том, что у вас отключена поддержка активности, поэтому он использует другое соединение для каждого запроса и порт, который затем нельзя использовать снова в течение нескольких минут. Он делает именно то, что должен делать.

Включите keep-alive, и ваша проблема исчезнет.

person user1495282    schedule 24.10.2013
comment
вы имеете в виду отключить keep-alive? - person Zapnologica; 19.05.2019

В конце концов я нашел исправление для этого на случай, если кто-то еще застрял!

Из здесь

https://support.microsoft.com/en-us/kb/196271

  1. Запустите редактор реестра.

  2. Найдите в реестре следующий подраздел и нажмите «Параметры»: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters.

  3. В меню «Правка» выберите «Создать» и добавьте следующую запись реестра:

    Имя значения: Максусерпорт

    Тип значения: DWORD

    Значение данных: 65534

    Допустимый диапазон: 5000-65534 (десятичный)

    По умолчанию: 0x1388 (5000 десятичных)

  4. Выйдите из редактора реестра и перезагрузите компьютер.

Это в сочетании с некоторым улучшенным кэшированием, поэтому данные не извлекаются каждый раз, когда пользователь загружает страницу, предотвратит повторение этого.

person shoughton123    schedule 18.06.2013
comment
можете ли вы объяснить, что именно это делает? - person JohnTube; 01.02.2015
comment
Вы можете найти полный ответ в этом ссылка. - person flaviussn; 15.05.2015
comment
это не решение, это хак, он просто отложит проблему до тех пор, пока вы не столкнетесь с более высокой нагрузкой - person mfarouk; 18.07.2017