在创建、使用和处置多个 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
这是预期的行为吗?我是否需要显式将连接标头值设置为关闭以防止出现这种情况?
httpClient.
DefaultRequestHeaders.
Connection.
Add("close");
每个实例HttpClient
池化其连接以获得更好的性能,但这意味着每个实例也会在不使用池化连接时将其保留在 TIME_WAIT 状态。
HttpClient
实际上是线程安全的、可重入的,并且是为扩展使用而设计的;它不应该被丢弃(即使它实现了IDisposable
)直到你的程序退出。您应该共享一个实例HttpClient
在整个申请过程中充分利用这一点。
更多信息可以找到here http://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)