Benjamin Soddy Benjamin Soddy - 2 months ago 26
HTTP Question

Why does HttpClient leave sockets open?

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");

Answer

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.

Comments