3

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

using (var client = new HttpClient(singletonHttpClientHandler, false);

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

在此处输入图像描述

请参阅https://docs.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 管理时才有意义,我认为是这种情况。

4

0 回答 0