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.
Use this code to disable HTTP Keep-Alive on the client:
This will set
Connection
request header toclose
.When you set
HttpWebRequest.KeepAlive = true
the header set is Connection: keep-aliveWhen you set
HttpWebRequest.KeepAlive = false
the header set is Connection: closeSo you will need
I hope this can help you, I have tested
I wrote HttpClientHandler, and in the handler just before the request I deleted the header "Connection". In this case, it sets the default "Connection: keep-alive". Even if before that you put it in the HttpClient by default, set properties, etc. Check your handlers.
See code below: