Могу ли я всегда создавать новый экземпляр IHttpClientFactory, даже если я могу использовать экземпляр дважды или более? - PullRequest
0 голосов
/ 16 апреля 2019

Я пишу веб-API на ядре C # .net и использую IHttpClientFactory для создания httpClients. Я настраиваю это на Startup.cs в ConfigurationServices. 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;
            });

Затем я использую его в одном dataProvider через DI.

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 и другие объекты описываются как SingleInstance в DI.

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.Microsoft , , , а также о некоторых сайтах.

1 Ответ

1 голос
/ 17 апреля 2019

В рамках одного запроса обычно используется только один HttpClient. Однако, если это проще, вы можете получить несколько экземпляров из IHttpClientFactory. Сам по себе HttpClient - просто тонкая оболочка, поэтому множественные экземпляры не оказывают большого влияния. Важной частью является то, что эти экземпляры происходят из IHttpClientFactory, который разделяет HttpMessageHandler между несколькими HttpClient экземплярами.

Единственная необычная часть вашего кода - оператор using; как правило, HttpClient экземпляры не располагаются (это все еще верно в мире IHttpClientFactory). Но это избавление не является плохим ; немного необычно.

Документы: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-2.1#httpclient-and-lifetime-management

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...