应该是什么HttpClient
WebAPI 客户端的生命周期?
拥有一个实例是否更好HttpClient
多次通话?
创建和处置的开销是多少HttpClient
根据请求,如下例所示(取自http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client):
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://localhost:9000/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
// New code:
HttpResponseMessage response = await client.GetAsync("api/products/1");
if (response.IsSuccessStatusCode)
{
Product product = await response.Content.ReadAsAsync<Product>();
Console.WriteLine("{0}\t${1}\t{2}", product.Name, product.Price, product.Category);
}
}
HttpClient
已经设计为可重复用于多次调用。即使跨多个线程。
这HttpClientHandler
具有旨在在调用之间重复使用的凭据和 Cookie。拥有一个新的HttpClient
实例需要重新设置所有这些东西。
另外,DefaultRequestHeaders
property 包含用于多次调用的属性。必须在每个请求上重置这些值就违背了这一点。
另一个主要好处HttpClient
是能够添加HttpMessageHandlers
进入请求/响应管道以应用横切关注点。这些可以用于日志记录、审计、限制、重定向处理、离线处理、捕获指标。各种各样不同的事情。如果在每个请求上创建一个新的 HttpClient,则需要在每个请求上设置所有这些消息处理程序,并且还需要以某种方式提供在这些处理程序的请求之间共享的任何应用程序级别状态。
您使用的功能越多HttpClient
,您越会发现重用现有实例是有意义的。
然而,我认为最大的问题是,当HttpClient
类被处置,它处置HttpClientHandler
,然后强制关闭TCP/IP
连接池中的连接由其管理ServicePointManager
。这意味着每个请求都会有一个新的HttpClient
需要重新建立一个新的TCP/IP
联系。
根据我的测试,在 LAN 上使用纯 HTTP,性能影响可以忽略不计。我怀疑这是因为有一个底层的 TCP keepalive 使连接保持打开状态,即使HttpClientHandler
尝试关闭它。
对于互联网上的请求,我看到了一个不同的故事。由于每次都必须重新打开请求,我发现性能下降了 40%。
我怀疑击中了HTTPS
连接会更差。
我的建议是在应用程序的生命周期中保留 HttpClient 的实例对于您连接到的每个不同的 API。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)