使用HttpClient
并不像我希望的那样直接。尽管它是一种IDisposable
类型,但将其包装在using
语句中并不是最佳实践,将其设置为单例甚至是理想的。但是,当您将 a 传递HttpClientHandler
给类似的构造函数时会HttpClient
怎样:
using (var client = new HttpClient(singletonHttpClientHandler, false);
我见过像上面这样的代码,其中HttpClient
故意将其包装在一个using
语句中,但它HttpClientHandler
是一个单例。文档表明客户端处理程序已被处理,除非第二个参数指示false
如上所述:
使用 HttpClient 的部分问题是必须与该 HttpClient 的所有实例共享超时之类的几个问题,因此,出于这个原因,创建使用可能由 HttpClientHandler 提供的相同连接池的单独的 HttpClient 实例会很好(假设这就是它的工作原理)。我担心的是我不希望 HttpClient 创建一个连接池,然后每次都将其处理掉。有多个帖子说明这对性能真的很不利。我似乎找不到任何关于有效使用 HttpClient 和 HttpClientHandlers 的好文档。
所以......我的问题基本上是:
一起使用 HttpClient 和 HttpClientHandler 时,是否最好将 HttpClientHandler 设为单例,然后using
每次在块中实例化尽可能多的新 HttpClient?-- 这只有在连接池由 HttpClientHandler 管理时才有意义,我认为是这种情况。