С# Как установить HttpClient Keep-Alive на false
У меня была низкая производительность с HTTP-запросами на.NET. HTTP-запрос GET для REST API на локальном хостинге занял около 500 мс. Я потратил много времени, чтобы исправить это. Я пробовал много способов: HttpClient
, HttpWebRequest
, WebClient
и RestSharp
. Ни один из них не работает. Большинство решений в Интернете говорили, чтобы установить параметр Proxy
равным null
но он все равно не будет работать быстрее.
Единственный способ, который я нашел, чтобы уменьшить это время, - установить параметр Keep-Alive запроса на false:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "GET";
request.KeepAlive = false;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Это отлично работает. Время сокращается до 7-10 мс. Но теперь по некоторым причинам мне нужно использовать HttpClient
вместо HttpWebRequest
. И я не могу найти, как установить Keep-Alive в false для HttpClient
. Единственное, что я нашел, это установить значение true, установив заголовок "connection" в "Keep-Alive".
Я использую этот код для запроса POST с помощью HttpClient:
HttpClient _http = new HttpClient();
_http.DefaultRequestHeaders.Accept.Clear();
_http.DefaultRequestHeaders.Add("Connection", "Keep-Alive");
_http.DefaultRequestHeaders.Add("Keep-Alive", "timeout=600");
var content = new StringContent(
request, Encoding.UTF8, "application/%appname%+xml");
content.Headers.ContentType.Parameters.Add(
new NameValueHeaderValue("type", "payload"));
HttpResponseMessage response = await _http.PostAsync(uri, content);
И все равно требуется около 500-600 мс.
Ответы
Ответ 1
Когда вы устанавливаете HttpWebRequest.KeepAlive = true
для набора заголовков установлено соединение: keep-alive
Когда вы устанавливаете HttpWebRequest.KeepAlive = false
заголовок имеет значение Connection: close
Поэтому вам понадобится
_http.DefaultRequestHeaders.Add("Connection", "close");
Ответ 2
Используйте этот код для отключения HTTP Keep-Alive на клиенте:
_http.DefaultRequestHeaders.ConnectionClose = true;
Это приведет к close
заголовка запроса Connection
.
Ответ 3
См. Следующий код:
HttpClient cli;
...
cli.DefaultRequestHeaders.Add("Connection", "keep-alive");
cli.DefaultRequestHeaders.Add("Keep-Alive", "600");
Ответ 4
Я надеюсь, что это может помочь вам, я проверил
_client.DefaultRequestHeaders.Connection.Add("Keep-Alive");
Ответ 5
Я написал HttpClientHandler, а в обработчике непосредственно перед запросом удалил заголовок "Соединение". В этом случае он устанавливает значение по умолчанию "Connection: keep-alive". Даже если до этого вы помещаете его в HttpClient по умолчанию, устанавливаете свойства и т.д. Проверьте свои обработчики.