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。