在创建,使用和处理多个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");
答案 0 :(得分:8)
HttpClient
的每个实例汇集其连接以获得更好的性能,但这意味着每个实例在未使用时也会在TIME_WAIT中保留池连接。
HttpClient
实际上是线程安全的,可重入的,并且设计用于扩展使用;在你的程序退出之前,它不应该被处理掉(即使它实现了IDisposable
)。您应该在整个应用程序中共享一个HttpClient
实例,以利用此功能。
可以找到更多信息here。
答案 1 :(得分:1)