为什么HttpClient会打开套接字?

时间:2016-09-27 20:03:45

标签: c# .net http

在创建,使用和处理多个HttpClient时,我注意到在TIME_WAIT状态下仍有套接字打开。

例如,运行以下内容后:

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;
                }
            }
        }
    }
}

我注意到netstat,套接字保持打开状态:

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

这是预期的行为吗?我是否需要显式设置Connection标头值以关闭以防止这种情况?

httpClient.
    DefaultRequestHeaders.
    Connection.
    Add("close");

2 个答案:

答案 0 :(得分:8)

HttpClient的每个实例汇集其连接以获得更好的性能,但这意味着每个实例在未使用时也会在TIME_WAIT中保留池连接。

HttpClient实际上是线程安全的,可重入的,并且设计用于扩展使用;在你的程序退出之前,它不应该被处理掉(即使它实现了IDisposable)。您应该在整个应用程序中共享一个HttpClient实例,以利用此功能。

可以找到更多信息here

答案 1 :(得分:1)

来自MSDN

  

每个HttpClient实例都使用自己的连接池,将其请求与其他HttpClient实例执行的请求隔离开来。

HttpClient池连接以获得更好的性能。