C# How to set HttpClient Keep-Alive to false

59,714

Solution 1

Use this code to disable HTTP Keep-Alive on the client:

_http.DefaultRequestHeaders.ConnectionClose = true;

This will set Connection request header to close.

Solution 2

When you set HttpWebRequest.KeepAlive = true the header set is Connection: keep-alive

When you set HttpWebRequest.KeepAlive = false the header set is Connection: close

So you will need

_http.DefaultRequestHeaders.Add("Connection", "close");

Solution 3

See code below:

HttpClient cli;
...
cli.DefaultRequestHeaders.Add("Connection", "keep-alive");
cli.DefaultRequestHeaders.Add("Keep-Alive", "600");
Share:
59,714
Vaskrol
Author by

Vaskrol

Updated on February 05, 2020

Comments

  • Vaskrol
    Vaskrol about 4 years

    I had a low performance problem with HTTP requests on .NET. The HTTP GET request to a REST API on the localhost took about 500 ms to complete. I spent a lot of time to fix it. I have tried many ways: HttpClient, HttpWebRequest, WebClient and RestSharp. None of them work. Most solutions on the Internet said to set Proxy parameter to null but it still won't work faster.

    The only way I found to reduce this time is to set the Keep-Alive parameter of request to false:

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
    request.Method = "GET";
    request.KeepAlive = false;
    
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    

    This works great. Time is reduced to 7-10 ms. But now in some reasons I need to use HttpClient instead of HttpWebRequest. And I can't find how to set Keep-Alive to false for HttpClient. The only thing I found is how to set it to true by setting a "connection" header to "Keep-Alive".

    I am using this code for POST request by 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);
    

    And it still takes about 500-600 ms to complete.

  • Vaskrol
    Vaskrol about 8 years
    It doesn't work. I've updated a question with my code.
  • Matt
    Matt almost 7 years
    The sample you posted that "works great" is the equivalent of KeepAlive=False. The header you state you tried is the equivalent of KeepAlive=True. You are doing the opposite of what you need to do.