When creating, using, and disposing several HttpClients I notice that there are sockets left open in the TIME_WAIT status.
For example, after running the following:
using System.Net.Http;
namespace HttpClientTest
{
public class Program
{
public static void Main(string[] args)
{
for (var i = 0; i < 10; i++)
{
using (var httpClient = new HttpClient())
{
var result = httpClient.
GetAsync("http://stackoverflow.com/").
Result;
}
}
}
}
}
I notice with netstat, that sockets are left open:
TCP 10.200.60.168:2722 151.101.193.69:http TIME_WAIT
TCP 10.200.60.168:2751 151.101.193.69:http TIME_WAIT
TCP 10.200.60.168:2752 151.101.193.69:http TIME_WAIT
TCP 10.200.60.168:2753 151.101.193.69:http TIME_WAIT
TCP 10.200.60.168:2754 151.101.193.69:http TIME_WAIT
TCP 10.200.60.168:2755 151.101.193.69:http TIME_WAIT
TCP 10.200.60.168:2756 151.101.193.69:http TIME_WAIT
TCP 10.200.60.168:2757 151.101.193.69:http TIME_WAIT
TCP 10.200.60.168:2758 151.101.193.69:http TIME_WAIT
TCP 10.200.60.168:2759 151.101.193.69:http TIME_WAIT
Is this expected behavior? Do I need to explicitly set the Connection header value to close to prevent this?
httpClient.
DefaultRequestHeaders.
Connection.
Add("close");
Each instance of HttpClient
pools its connections for better performance, but this means that each instance also leaves the pooled connections in TIME_WAIT when they are not in use.
HttpClient
is actually thread-safe, reentrant, and designed for extended use; it should not be disposed of (even though it implements IDisposable
) until your program exits. You should share one instance of HttpClient
throughout your application to take advantage of this.
More information can be found here.
From MSDN
every HttpClient instance uses its own connection pool, isolating its requests from requests executed by other HttpClient instances.
HttpClient
pools connections for better performance.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With