Создайте экземпляр httpclient для каждого webrequest или одного экземпляра.
Всем Привет,
Я прочитал так много статей о HttpClient. В некоторых статьях упоминается создание одного экземпляра httpclient и повторное использование его во всем приложении. Но в некоторых статьях упоминается создание нового экземпляра httpclient для каждого webrequest.
**// New instance per web request. It disposes the httpClient after use.** using(var httpClient = new HttpClient()) { // Get/ Post/ Put/ Delete }
Не могли бы вы сообщить мне, какой подход лучше?
Я создал небольшой POC. Тест 1: один экземпляр httpclient.
private static readonly HttpClient _httpClient = new HttpClient(); // Note : Application Hosted in Local IIS private const string ServerGetUrl = "http://localhost:80/api/service/getdata"; private static void TestPingWithSingleInstance() { Parallel.For(0, 5, i => { _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); var response = _httpClient.GetAsync(ServerGetUrl).GetAwaiter().GetResult(); var data = response.Content.ReadAsStringAsync().GetAwaiter().GetResult(); Console.WriteLine(data); Console.WriteLine("==============="); }); }
Когда я запустил команду netstat. Он отображает 5 открытых портов.
TCP 127.0.0.1:46336 DESKTOP-OEOGI0L:HTTP установлен
TCP 127.0.0.1:46337 DESKTOP-OEOGI0L:HTTP установлен
TCP 127.0.0.1:46338 DESKTOP-OEOGI0L:HTTP установлен
TCP 127.0.0.1:46339 DESKTOP-OEOGI0L:HTTP установлен
TCP 127.0.0.1:46340 DESKTOP-OEOGI0L:HTTP установлен
Тест 2: создание экземпляра для каждого веб-запроса.
private static void TestPingWithDisposableInstance() { using (var httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); var response = httpClient.GetAsync(ServerGetUrl).GetAwaiter().GetResult(); var data = response.Content.ReadAsStringAsync().GetAwaiter().GetResult(); Console.WriteLine(data); Console.WriteLine("==============="); } }
Когда я запустил команду netstat. Он отображает 5 открытых портов.
TCP 127.0.0.1:46233 DESKTOP-OEOGI0L:http TIME_WAIT
TCP 127.0.0.1:46234 DESKTOP-OEOGI0L:http TIME_WAIT
TCP 127.0.0.1:46235 DESKTOP-OEOGI0L:http TIME_WAIT
TCP 127.0.0.1:46236 DESKTOP-OEOGI0L:http TIME_WAIT
TCP 127.0.0.1:46237 DESKTOP-OEOGI0L:http TIME_WAIT
Такое же количество портов будет открыто, если мы используем один экземпляр или экземпляр на веб-запрос. Не могли бы вы, пожалуйста, дать мне знать лучший подход ?
Примечание: Я использую .NET 4.5.1 framework.
Заранее спасибо.
Что я уже пробовал:
Я создал выше POC. Одинаковое количество портов открыто для обоих подходов.
Thomas Daniels
Я больше не вижу дерева комментариев в своем ответе, поэтому я комментирую здесь как ответ на ваш последний комментарий: Я не знаю принципов REST, поэтому, если запрос POST не будет следовать им, то я полагаю, что запрос GET-это нормально. Причина, по которой я бы рекомендовал POST, а не GET, заключается в том, что маркер доступа можно рассматривать как своего рода пароль, а причина предпочтения POST там заключается в том, что запрос GET может оказаться в журнале доступа с включенным паролем в параметрах, и это плохо.