c# - 每个请求创建全新的 HttpClient 是否便宜

标签 c# .net .net-core httpclient

自从 MS 文档 was always saying 以来,我一直认为这是一种反模式“HttpClient 旨在为每个应用程序实例化一次,而不是每次使用”。但我越深入现代 C# 开发,我就越发现事情发生了变化。例如这里是 a tweet关于 IHttpClientFactory

A new HttpClient is created each time, but HttpClient is cheap to create.

The internal HTTP handler that the HttpClient uses to make the request (i.e. the part that does all the work and is expensive) is intelligently cached and reused by the factory.

也就是说,如果您为多个 HttpClient 重用 HttpMessageHandler,那您就大功告成了。

假设我们要为每个 HTTP 请求设置一些 header 。我们是否应该使用 HttpRequestMessage 拦截器以旧的方式来做,或者我可以只创建一个每个请求的 HttpClient 因为我要重用相同的 HttpRequestMessage 我完全没问题?它是执行按请求消息修改的现代方式吗?

最佳答案

HttpRequestMessage 不打算重复使用。 HttpClient 在发送您的请求时实际上会修改 HttpRequestMessage,因此之后再使用它并不是一个好主意。

一般情况下,使用IHttpClientFactory。它不仅仅是重用消息处理程序,例如定期回收连接池。

针对单个消息处理程序创建多个 HttpClient 实例的一个很好的用途是,如果您想设置不同的默认 header 以针对同一端点调用多个 API。这允许汇集到该端点的连接,而无需在每条消息上设置 header 。

关于c# - 每个请求创建全新的 HttpClient 是否便宜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58507704/

相关文章:

c# - 没有对的单独记录

c# - 为asp.net MVC3项目配置log4net

.NET/MySQL 连接器 : Certificate Store Location

.net-core - 无法从 C :\创建分析器 Microsoft.AspNetCore.Mvc.Analyzers.AvoidHtmlPartialAnalyzer 的实例

c# - 使用 C# (.Net Core) 测量时间

c# - 如何防止 SQL Server 存储过程与 EF 并发执行?

c# - 按 id 区分包含对象的列表

c# - 您是只使用一次 EnsureIndex() 还是为您插入到数据库中的每个文档使用?

c# - 使用 C# 和 IIS 7 保护大量下载

c# - Linux 上带有 .NET 核心的 Roslyn : How can I load an external project?