Состояние соединения HttpClient остается в TIME_WAIT после использования в течение некоторого времени, что вызывает исключение Socket - PullRequest
5 голосов
/ 04 мая 2019

Мы используем HttpClient для доступа к WebAPI, размещенному на другом сервере. У нас есть приложение MVC5, которое получает данные WebAPI Window Server 2012 R2 с IIS 8.5

Ниже приведен код, который используется для получения данных из webapi

//creating static instance of http client
private static HttpClient client = new HttpClient();

//static method to add common header
static ApiCall()
{
   client.DefaultRequestHeaders.Add("Authorization", 
                 string.Format("Value {0}", AppSettings.ApiSecurityKey));
   client.DefaultRequestHeaders.ConnectionClose = true;
}

//finally posting data to the api
//objprop contains the data and other setting
string url = "apiurl";
var postContent = new StringContent(objprop.DataForPost, 
      System.Text.Encoding.UTF8, objprop.ContentType);
response = client.PostAsync(url, postContent).Result;

Но во время теста PT я получаю несколько запросов в состоянии TIME_WAIT. Из-за этого мы получаем исключение сокета.

Как лучше всего использовать HttpClient?

Есть ли какая-либо настройка, которая может освободить гнездо после использования.

Подобный вопрос здесь
1. Как предотвратить исчерпание сокета / порта?
2. Почему HttpClient оставляет розетки открытыми?
но это не помогло мне.

Редактировать 1 Подробнее

: InnerException - System.Net.Http.HttpRequestException: при отправке запроса произошла ошибка. ---> System.Net.WebException: невозможно подключиться к удаленному серверу ---> System.Net.Sockets.SocketException: обычно допускается только одно использование каждого адреса сокета (протокола / сетевого адреса / порта) x.x.x: 80 в System.Net.Sockets.Socket.InternalEndConnect (IAsyncResult asyncResult) в System.Net.Sockets.Socket.EndConnect (IAsyncResult asyncResult) в System.Net.ServicePoint.ConnectSocketInternal (логическое connectFailure, сокет s4, сокет s6, сокет и сокет, IP-адрес и адрес, состояние ConnectSocketState, IAsyncResult asyncResult, исключение и исключение) --- Конец внутренней трассировки стека исключений --- в System.Net.HttpWebRequest.EndGetRequestStream (IAsyncResult asyncResult, TransportContext & context) в System.Net.Http.HttpClientHandler.GetRequestStreamCallback (IAsyncResult ar) --- Конец внутренней трассировки стека исключений ---: URL- http://x.x.x.com//api/GetMenu

1 Ответ

2 голосов
/ 11 мая 2019

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

TIME_WAIT - обязательная фаза соединения TCP / IP; как только соединение установлено, сторона , которая инициирует закрытие соединения , перейдет в это состояние на предварительно настроенное время.

TCP / IP имеет ограниченный пул портов для входов и выходов.

Новые соединения используют их подмножество (так называемый динамический или эфемерный диапазон портов) для выделения порта на каждой стороне.

Ваше приложение получает сообщение об ошибке «Адрес используется» при попытке создать новое исходящее соединение, но в TCP не хватает локальных портов в динамическом диапазоне.

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

В этой статье Microsoft подробно описано, как изменить настройки Windows TCP / IP для высоких скоростей соединения:

  • Изменение TIME_WAIT периода от 120 до 30 секунд
  • Увеличение числа динамических портов с 16384 до 64511

Выполнение обоих этих действий увеличит максимальную скорость соединения со 136 соединений в секунду до примерно 2150.

...