对多个端点使用 HttpClient 和 HttpClientHandler 的最佳实践是什么?

Sam*_*Sam 5 c# dotnet-httpclient httpclienthandler

使用HttpClient并不像我希望的那么简单。尽管它是一种IDisposable类型,但将其包装在声明中并不是最佳实践using,甚至将其设置为单例也是理想的选择。HttpClientHandler但是,当您将 a 传递给类似的构造函数时会怎么样HttpClient

using (var client = new HttpClient(singletonHttpClientHandler, false);
Run Code Online (Sandbox Code Playgroud)

我见过像上面这样的代码,其中HttpClient故意将 包裹在using语句中,但HttpClientHandler是单例。文档表明客户端处理程序已被处理,除非第二个参数指示false如上面所做的那样:

在此输入图像描述

请参阅https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpclient?view=netframework-4.8#constructors

使用 HttpClient 的部分问题是一些事情,比如超时必须与该 HttpClient 的所有实例共享,因此出于这个原因,最好创建使用 HttpClientHandler 提供的相同连接池的单独的 HttpClient 实例(假设这就是它的工作原理)。我担心的是,我不希望 HttpClient 创建一个连接池,然后每次都会将其释放。有很多帖子讨论了这对性能有何影响。我似乎找不到任何关于有效使用 HttpClient 和 HttpClientHandlers 的好的文档。

所以...我的问题基本上是:

当一起使用 HttpClient 和 HttpClientHandler 时,是否最好将 HttpClientHandler 设为单例,然后using每次在块中实例化尽可能多的新 HttpClient?-- 这又只有当连接池由 HttpClientHandler 管理时才有意义,我认为就是这种情况。