it-swarm.com.ru

C # Как установить HttpClient Keep-Alive в false

У меня была проблема низкой производительности с HTTP-запросами в .NET. Запрос HTTP GET к API REST на локальном хосте занял около 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 мсек.

17
Vaskrol

Когда вы устанавливаете HttpWebRequest.KeepAlive = true, заголовок устанавливается как Connection: keep-alive

Когда вы устанавливаете HttpWebRequest.KeepAlive = false, заголовок устанавливается как Connection: close

Так вам понадобится 

_http.DefaultRequestHeaders.Add("Connection", "close");
24
Jerry Joseph

Используйте этот код для отключения HTTP Keep-Alive на клиенте:

_http.DefaultRequestHeaders.ConnectionClose = true;

Это установит Connection заголовок запроса в close.

5
Pavel Chuchuva

Смотрите код ниже:

HttpClient cli;
...
cli.DefaultRequestHeaders.Add("Connection", "keep-alive");
cli.DefaultRequestHeaders.Add("Keep-Alive", "600");
2
Riad Baghbanli

Я надеюсь, что это может помочь вам, я проверил

_client.DefaultRequestHeaders.Connection.Add("Keep-Alive");
0
Xiaoliang Sha

Я написал HttpClientHandler, а в обработчике непосредственно перед запросом удалил заголовок «Соединение». В этом случае он устанавливает значение по умолчанию «Connection: keep-alive». Даже если до этого вы помещаете его в HttpClient по умолчанию, устанавливаете свойства и т.д. Проверьте свои обработчики.

0
Anton Ilyin