依赖注入:HttpClient 还是 HttpClientFactory?

Dependency injection: HttpClient or HttpClientFactory?

我到处都可以看到在 DI 中创建客户端(基本、命名、类型)的三种主要方法,但我找不到注入 IHttpClientFactoryHttpClient(两者都可能)的地方。

Q1:请问注入IHttpClientFactoryHttpClient有什么区别?

Q2:如果注入了IHttpClientFactory,我每次调用都应该使用factory.CreateClient()吗?

总结

  • HttpClient 只能在 Typed clients
  • 内部注入
  • 对于其他用途,您需要IHttpClientFactory
  • 在这两种情况下,HttpClientMessageHandler 的生命周期都由框架管理,因此您不必担心(错误地)处置 HttpClients

例子

为了直接注入 HttpClient,您需要注册一个特定的 Typed 服务来接收客户端:

services.AddHttpClient<GithubClient>(c => c.BaseAddress = new System.Uri("https://api.github.com"));

现在我们可以将其注入 typed GithubClient

public class GithubClient
{
    public GithubClient(HttpClient client)
    {
        // client.BaseAddress is "https://api.github.com"
    }
}

你不能在AnotherClient里面注入HttpClient,因为它不是AnotherClient

public class AnotherClient
{
    public AnotherClient(HttpClient client)
    {
        // InvalidOperationException, can't resolve HttpClient 
    }
}

但是,您可以:
1. 注入 IHttpClientFactory 并调用 CreateClient()。此客户端将 BaseAddress 设置为 null
2. 或者将 AnotherClient 配置为不同类型的客户端,例如,不同的 BaseAdress.

更新

根据您的评论,您正在注册一个 Named 客户端。还是从IHttpClientFactory.CreateClient()方法解析,但是需要通过client的'name'

注册

services.AddHttpClient("githubClient", c => c.BaseAddress = new System.Uri("https://api.github.com"));

用法

// note that we inject IHttpClientFactory
public HomeController(IHttpClientFactory factory)
{
    this.defaultClient = factory.CreateClient(); // BaseAddress: null
    this.namedClient = factory.CreateClient("githubClient"); // BaseAddress: "https://api.github.com"
}

遗憾的是我无法发表评论,只能 Post 回答。因此我建议您查看以下链接:

https://docs.microsoft.com/en-us/dotnet/architecture/microservices/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests

https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/

关于您的问题,或多或少可以归结为:

Q1 -> IHttpClientFactory 处理 HttpClient 实例的连接池,如果 HttpClient 使用错误,这将帮助您解决链接中描述的加载和处理问题。

Q2 -> 是的,根据微软文档

,你应该使用 factory.create 客户端