0

因此,如果我有一个通过 DI 注册为单个实例(Singleton)的类,并且我在该类中注入了 IHttpClientFactory。

 class MyService : IMyService
    {
        private readonly IHttpClientFactory _clientFactory;

        public MyService(IHttpClientFactory clientFactory)
        {
            _clientFactory = clientFactory;
        }
        public async Task Call()
        {
            var client = _clientFactory.CreateClient("MyClient");
            await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, "http://test.com"));
        }
    }

在每次调用函数调用时我使用 _clientFactory.CreateClient 创建一个新客户端是否正确?或者我应该在工厂的构造函数中创建一个客户端,然后为每个函数调用重新使用它?

谢谢

4

1 回答 1

1

每次调用MyService.Call()方法时都可以创建一个客户端。完成后无需丢弃它。IHttpClientFactory为您管理 s 使用的资源HttpClient

文档

HttpClient每次CreateClient在 上调用时都会返回一个新实例IHttpClientFactoryHttpMessageHandler为每个命名的客户端创建一个。工厂管理HttpMessageHandler实例的生命周期。

IHttpClientFactoryHttpMessageHandler化工厂创建的实例以减少资源消耗。如果实例的生命周期尚未到期,则HttpMessageHandler在创建新实例时可以从池中重用实例。HttpClient

...

HttpClient实例通常可以被视为不需要处理的 .NET 对象。Disposal 取消传出的请求,并保证给定的HttpClient实例在调用后不能使用DisposeIHttpClientFactory跟踪和处置HttpClient实例使用的资源。

HttpClient长时间保持单个实例处于活动状态是IHttpClientFactory. 这种模式在迁移到IHttpClientFactory.

于 2021-07-08T09:25:04.293 回答