首页 > 解决方案 > 即使我可以使用实例两次或更多次,我是否可以始终创建 IHttpClientFactory 的新实例?

问题描述

我在 .NET Core 中编写了一个 WebAPI,并使用 IHttpClientFactory 来创建 httpClients。我在 ConfigurationServices 的 Startup.cs 上对其进行了自定义。

services.AddHttpClient("ITSMServiceClient", m =>
            {
                m.DefaultRequestHeaders.Accept.Clear();
                m.DefaultRequestHeaders.Add("Cache-Control", "no-cache");
            }).SetHandlerLifetime(TimeSpan.FromMinutes(10))
            .ConfigurePrimaryHttpMessageHandler(() =>
            {
                var handler = new HttpClientHandler()
                {
                    AllowAutoRedirect = false,
                    UseCookies = false
                };

                // Отключаем проверку валидности http-сертификата (если необходимо)
                handler.ClientCertificateOptions = ClientCertificateOption.Manual;
                handler.ServerCertificateCustomValidationCallback =
                               (httpRequestMessage, cert, cetChain, policyErrors) => true;

                return handler;
            });

然后我通过 DI 在一个 dataProvider 中使用它。

private readonly IHttpClientFactory _clientFactory;

        public ExecuteDataProvider(IHttpClientFactory clientFactory)
        {
            _clientFactory = clientFactory;
        }

我将此提供者的方法用于所有发送请求

public async Task<HttpResponseMessage> PostAsync(HttpRequestMessage request)
        {
            using (var client = _clientFactory.CreateClient("ITSMServiceClient"))
            {
                return await client.SendAsync(request);
            }
        }

我有一个问题。即使我可以在代码中重复使用实例两次或更多次,是否总是从 _clientFactory 获取新实例?我所有的 dataProvider 和其他实体都描述为 DI 中的 SingleInstance。

builder.RegisterType<ExecuteDataProvider>().As<IExecuteDataProvider>().SingleInstance();

现在我使用它是这样的:

var request = CreatePostRequest(url, parameters, jParameters, checkingToken);

HttpResponseMessage httpResponseMessage = await _executeCoreDataProvider.PostAsync(request);
if (await CheckingForUnauthorizedToken(httpResponseMessage, checkingToken))
{
        request = CreatePostRequest(url, parameters, jParameters, checkingToken);
        httpResponseMessage = await _executeCoreDataProvider.PostAsync(request);
}
response = await httpResponseMessage.Content.ReadAsStringAsync();
httpResponseMessage.Dispose();

而且我担心两次获得 HttpClient。这是正常的还是使用一个客户端实例会更正确?

我已经在Microsoft Docs上阅读了有关 ClientFactory 的信息;这个,还有其他一些网站。

标签: c#.net-corehttpclient

解决方案


在单个请求的范围内,只使用一个HttpClient. 但是,如果它更容易,您可以从IHttpClientFactory. 它HttpClient本身只是一个薄包装器,因此多个实例不会产生太大影响。重要的部分是这些实例来自,它在多个实例之间IHttpClientFactory共享。HttpMessageHandlerHttpClient

代码中唯一不寻常的部分是using语句;通常,HttpClient不会处理实例(这在IHttpClientFactory世界上仍然是正确的)。但这种处置还不错;只是有点不寻常。

文档:https ://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-2.1#httpclient-and-lifetime-management


推荐阅读