即使我可以使用实例两次或更多次,也可以始终创建IHttpClientFactory的新实例吗?

时间:2019-04-16 07:41:00

标签: c# .net httpclient core

我在C#.net核心上编写Web api,并使用IHttpClientFactory创建httpClient。我在ConfigurationServices中的Startup.cs上对其进行了自定义。 A

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。是正常的还是使用一个客户端实例会更正确?

我已经了解了ClientFactory docs.Microsoftthis以及一些站点。

1 个答案:

答案 0 :(得分:1)

在单个请求的范围内,通常仅使用一个HttpClient。但是,如果比较容易,您可以从IHttpClientFactory获取多个实例。 HttpClient本身只是一个薄包装器,因此多个实例的影响不大。重要的部分是这些实例来自IHttpClientFactory,它们在多个HttpMessageHandler实例之间共享HttpClient

代码中唯一不寻常的部分是using语句;通常,不会丢弃HttpClient实例(在IHttpClientFactory世界中仍然如此)。但是这种处理方法不是 bad ;只是有点不寻常。

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