Воссоздание именованного HttpClient приводит к нескольким вызовам ConfigureClient - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь создать консольное приложение веб-парсера, которое использует несколько учетных записей пользователей для получения записей и создания отчета. Чтобы избежать создания нового HttpClient для каждого вызова и входа в систему, я также кэширую объект CustomHttpClient, чтобы файлы cookie не были потеряны.

Иногда во время HTTP-запроса возникают ошибки веб-сайта, и мне приходится воссоздавать новый HttpClient для пользователю повторно войти в систему, а затем повторить попытку. Но воссоздание нового именованного клиента с тем же именем вызывает несколько вызовов этого кода ConfigureClient ниже:

 c.BaseAddress = new Uri("http://blob");
    c.DefaultRequestHeaders.AcceptEncoding.ParseAdd("gzip, deflate");
    c.DefaultRequestHeaders.CacheControl = new System.Net.Http.Headers.CacheControlHeaderValue() { MaxAge = TimeSpan.Zero };

Фактический код:

CookieContainer cookieContainer = new CookieContainer();        
var builder = services.AddHttpClient(name, c =>
{
    c.BaseAddress = new Uri("http://blob");
    c.DefaultRequestHeaders.AcceptEncoding.ParseAdd("gzip, deflate");
    c.DefaultRequestHeaders.CacheControl = new System.Net.Http.Headers.CacheControlHeaderValue() { MaxAge = TimeSpan.Zero };
}).ConfigurePrimaryHttpMessageHandler(() =>
{
    var clientHandler = new HttpClientHandler()
    { CookieContainer = cookieContainer, AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate };
    return clientHandler;
});
var clientFactory = builder.Services.BuildServiceProvider().GetService<IHttpClientFactory>();
return new CustomHttpClient(clientFactory.CreateClient(name), cookieContainer);

При изучении ServiceCollection я обнаружил несколько IConfigureOptions записей в коллекции. Каждый раз я добавляю http-клиент с помощью сервисов. AddHttpClient, HttpClientFactory добавляет 2 записи в коллекцию сервисов, что приводит к множественным вызовам. Это предназначено? В идеале для именованного клиента должен быть один вызов для настройки клиента и повторного создания клиента с тем же именем в случае ошибки или замены существующего клиента, и должна быть возможность удалить и воссоздать HttpClient.

Что-то не так с реализацией?

...