Недавно при написании асинхронного кода, который часто вызывает API, я получил это ИСКЛЮЧЕНИЕ ПОРТА:

Произошла одна или несколько ошибок. При отправке запроса произошла ошибка. Невозможно подключиться к удаленному серверу. Обычно разрешено только одно использование каждого адреса сокета (протокол/сетевой адрес/порт) 127.0.0.1:53956 StackTrace: в System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) в System.Threading .Tasks.Task`1.GetResultCore (логическое значение ожиданияCompletionNotification) в System.Threading.Tasks.Task`1.get_Result()

При поиске в Интернете я нашел несколько странных ответов на увеличение порта в реестре и уменьшение времени ожидания запроса.
Но после 2 часов отладки и разочарования я понял основную причину проблемы.

В ЧЕМ БЫЛА ПРОБЛЕМА:

Я узнал, что основной причиной возникновения этой проблемы является документация MSDN об использовании ключевого слова и его использовании для удаления объектов. Обычно мы используем оператор using для создания объекта. как только область использования оператора заканчивается, CLR очищает созданный объект. Но это загвоздка с HttpClient. При создании экземпляра HttpClient он в основном получает порт и устанавливает статус ESTABLISHED для этого порта. Как только клиенты получают ответ от сервера, HttpClient меняет состояние на статус TIME_WAIT. В состоянии TIME_WAIT соединение будет закрыто со стороны клиента, но сокет по-прежнему ожидает любого дополнительного пакета, который был задержан или застрял в сети. Теперь, несмотря на то, что объект HttpClient был удален, порт по-прежнему находится в непригодном для использования состоянии для нового запроса. Поэтому, если у вас есть болтливая система, в которой вы очень часто выполняете вызовы API, вы можете быть истощены доступными номерами портов.

ПОНИМАТЬ ИЗ КОДА:

В этом фрагменте кода я делаю 1000 запросов. Таким образом, он будет создавать объект httpclient 1000 раз, и каждый запрос будет получать порт. Таким образом, у вас может быть не так много доступных портов в системе, что приведет к проблеме «PORT Exception».

КАК ИСПРАВИТЬ:

Я думаю, что HttpClient - это один из классов в .Net, которому нужно уделять особое внимание, чтобы создать свой объект. Мы должны совместно использовать объект httpClient для любого запроса N, который принимает один и тот же заголовок запроса. Это значительно повысит производительность за счет повторного использования тех же сокетов и уменьшения потерь сокетов.

ПОСЛЕДНЕЕ ПРИМЕЧАНИЕ:

Исключение «вне сокета» не кажется большой проблемой, пока вы не начнете создавать систему, которая требует большого количества обращений к клиенту и серверу. Поэтому всегда делайте HttpClient статическим и не удаляйте свой объект Httpclient до тех пор, пока вам не понадобится изменить поведение вашего http-запроса.