在 .NET Core 中探索 HTTP 客户端

已完成

超文本传输协议 (HTTP) 用于从 Web 服务器请求资源。 Web 上有许多类型的资源可用,并且 HTTP 定义了一组用于访问这些资源的请求方法。 在 .NET Core 中,这些请求通过 HttpClient 实例发出。

可通过两个选项在应用中实现 HttpClient,建议根据客户端生存期管理需求选择实现:

  • 对于生存期较长的客户端,请使用 static 类创建 HttpClient 或单一实例,并设置 PooledConnectionLifetime
  • 对于生存期较短的客户端:使用由 IHttpClientFactory 创建的客户端

使用 HttpClient 类实现

System.Net.Http.HttpClient 类用于发送 HTTP 请求以及从 URI 所标识的资源接收 HTTP 响应。 HttpClient 实例是应用于该实例执行的所有请求的设置的集合,每个实例都使用自己的连接池,从而将其请求与其他请求隔离开来。 从 .NET Core 2.1 开始,SocketsHttpHandler 类提供实现,使行为在所有平台上保持一致。

HttpClient 仅在创建连接时解析 DNS 条目。 它不跟踪 DNS 服务器指定的任何生存时间 (TTL)。 如果 DNS 条目定期更改,客户端不会意识到这些更新。 要解决此问题,可以通过设置 PooledConnectionLifetime 属性来限制连接的生存期,以便在替换连接时重复执行 DNS 查找。

在以下示例中,HttpClient 配置为重复使用连接 15 分钟。 在 TimeSpan 指定的 PooledConnectionLifetime 后,系统会关闭连接,然后创建一个新连接。

var handler = new SocketsHttpHandler
{
    PooledConnectionLifetime = TimeSpan.FromMinutes(15) // Recreate every 15 minutes
};
var sharedClient = new HttpClient(handler);

使用 IHttpClientFactory 实现

IHttpClientFactory 充当工厂抽象,可以使用自定义配置创建 HttpClient 实例。 .NET Core 2.1 中引入了 IHttpClientFactory。 基于 HTTP 的常见 .NET 工作负载可以轻松利用中间件。

调用任何 AddHttpClient 扩展方法时,将 IHttpClientFactory 和相关服务添加到 IServiceCollection。 IHttpClientFactory 类型具有以下优点:

  • HttpClient 类公开为依赖项注入就绪类型。
  • 提供一个中心位置,用于命名和配置逻辑 HttpClient 实例。
  • 通过 HttpClient 中的委托处理程序来编码出站中间件的概念。
  • 为基于 Polly 的中间件提供扩展方法,以利用 HttpClient 中的委派处理程序。
  • 管理基础 HttpClientHandler 实例的缓存和生存期。 自动管理可避免手动管理 HttpClient 生存期时出现的常见域名系统 (DNS) 问题。
  • 为通过工厂创建的客户端发送的所有请求添加可配置的日志记录体验。

应该让 HttpClientFactory 和框架管理 HttpClient 实例的生存期和实例化。 此生存期管理有助于避免手动管理 HttpClient 生存期时可能出现的常见问题,例如 DNS(域名系统)问题。

在应用中可以通过以下多种方式使用 IHttpClientFactory

最佳方法取决于应用要求。