为了账号安全,请及时绑定邮箱和手机立即绑定

在WebAPI客户机中每次调用创建一个新的HttpClient的开销是多少?

在WebAPI客户机中每次调用创建一个新的HttpClient的开销是多少?

慕容3067478 2019-07-03 15:28:35
在WebAPI客户机中每次调用创建一个新的HttpClient的开销是多少?什么应该是HttpClientWebAPI客户端的生命周期?是否最好有一个HttpClient多个电话?创建和处理HttpClient每个请求,如下面的示例(摘自http:/www.asp.net/web-api/概括/web-api-客户端/调用-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);     }}
查看完整描述

3 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

HttpClient已经设计用于多个呼叫。..甚至跨越多个线程。这个HttpClientHandler具有可跨调用重用的凭据和Cookies。有新的HttpClient比如需要重新设置所有的东西。此外,DefaultRequestHeaders属性包含用于多个调用的属性。必须在每个请求上重置这些值,这一点就失败了。

另一个主要好处是HttpClient是添加以下内容的能力HttpMessageHandlers在请求/响应管道中应用横切关注点。它们可以用于日志记录、审计、节流、重定向处理、脱机处理、捕获度量。各种各样的东西。如果在每个请求上创建了一个新的HttpClient,那么需要在每个请求上设置所有这些消息处理程序,并且还需要提供这些处理程序请求之间共享的任何应用程序级状态。

的特性使用得越多。HttpClient,您将更多地看到重用现有实例是有意义的。

但是,最大的问题,在我看来是,当HttpClient类被处理,它处理HttpClientHandler,然后强行关闭TCP/IP管理的连接池中的连接。ServicePointManager..这意味着每个请求都有一个新的HttpClient需要重新建立一个新的TCP/IP连接。

根据我的测试,在LAN上使用普通HTTP,性能的影响是可以忽略不计的。我怀疑这是因为有一个底层的tcp保持活动,即使在以下情况下,该连接仍然处于打开状态。HttpClientHandler试图关闭它。

在互联网上的请求中,我看到了一个不同的故事。由于每次都必须重新打开请求,我已经看到了40%的性能下降。

我怀疑HTTPS联系会更糟。

我的建议是在应用程序的生存期内保留一个HttpClient实例对于您连接到的每个不同的API。


查看完整回答
反对 回复 2019-07-03
  • 3 回答
  • 0 关注
  • 908 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信