System.Net.Http.HttpRequestException на веб-сервере - PullRequest
2 голосов
/ 19 мая 2019

Я размещаю asp.net web api в лазурном веб-приложении. Приложение размещено на двух параллельных экземплярах веб-приложений Azure.

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

System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.WebException: Unable to connect to the remote server ---> 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

На нашем веб-сервере мы отправляем множество коротких HTTP-запросов на дополнительные серверы, используя HttpClinet. Из моего исследования приведенного выше кода ошибки видно, что в базовой ОС исчерпаны «пользовательские» TCP-порты. Сначала я подумал, что это какая-то ошибка в библиотеке HttpClient .net. Однако мы попробовали экземпляр static HttpClient, а также метод using dispose. Ни один не решить нашу проблему. Помогает только то, что мы вручную перезапускаем веб-приложение каждый час, что, безусловно, не является долгосрочным решением.

Я не могу запустить netstat в веб-приложении Azure, чтобы посмотреть, что происходит с сокетами.

Число запросов, которые мы делаем, составляет примерно 100 000 в день. Это не должно перегружать одну машину, не говоря уже о двух. Так что, должно быть, что-то не так.

Как мы можем решить эту проблему?

У меня есть несколько вопросов:

  • Работает ли httpclient на работу, а это тысячи запросов на публикацию http?
  • В любом случае можно ли заставить HttpClient использовать http2, когда он будет выполнять несколько запросов в одном сокете tcp.
  • Какие еще технологические опции есть? По сути, мы хотим отправить объект json с одного сервера на другой и вернуть объект json в ответ. Будет ли работать что-то вроде azure service, где у него будет несколько сокетов, и он будет выдавать много запросов через эти сокеты?

1 Ответ

1 голос
/ 21 мая 2019

Я только что натолкнулся на проблему, и кажется, что когда вы достигаете TCP-портов больше 5000, возникает эта ошибка с тем же исключением, что и у вас (если вы отправляете 100000 запросов в день, естественно открыть более 5000 порт за один раз)

Существует также способ исправить это, добавив MaxUserPort (тип значения DWORD) в Редакторе реестра на HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

для получения дополнительной информации об этой проблеме https://support.microsoft.com/en-us/help/196271/when-you-try-to-connect-from-tcp-ports-greater-than-5000-you-receive-t

Также изменение MaxUserPort может исправить вашу проблему, но она создаст еще одну, особенно если вы получаете атаку TCP, открывая много портов для сбоя вашей системы, поэтому лучше выбирать максимальное значение с осторожностью (и поэтому есть такая настройка)

Примечание: вы также можете использовать Tcp-клиент, но тогда вам нужно вручную создать http-запрос, лучше придерживаться http-клиента

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...