Как настроить веб-прокси для HttpClient, созданного напрямую через HttpClientFactory? - PullRequest
0 голосов
/ 27 сентября 2018
  • Под прямым словом я имею в виду отсутствие помощников Asp.Net Core IoC / DI.

Я не нашел документов по этому поводу, и я думаю, что мое текущее решение не оптимально, потому что обработчикHttpClientFactory не управляет жизненным циклом:

var proxiedHttpClientHandler = new HttpClientHandler() { Proxy = httpProxy };
_createHttpClient = () => HttpClientFactory.Create(proxiedHttpClientHandler);

Есть ли лучшее решение?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

При добавлении клиента в набор сервисов вы должны иметь возможность настроить обработчик там

Используя подход именованного клиента, я буду использовать константу для хранения имени клиента.

public static class NamedHttpClients {
    public const string ProxiedClient = "ProxiedClient";
}

Оттуда это просто вопрос настройки клиента

//...
var serviceCollection = new ServiceCollection();

serviceCollection
    .AddHttpClient(NamedHttpClients.ProxiedClient)
    .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler() { 
        Proxy = httpProxy 
    });

var services = serviceCollection.BuildServiceProvider();

, чтобы при вызове клиента через разрешенный IHttpClientFactory

var httpClientFactory = services.GetService<IHttpClientFactory>();

var client = httpClientFactory.CreateClient(NamedHttpClients.ProxiedClient);

возвращенный клиент использовал обработчикс прокси.

0 голосов
/ 27 сентября 2018

Вы можете сделать что-то вроде этого:

private HttpClient ClientFactory()
{
    var proxiedHttpClientHandler = new HttpClientHandler(){ UseProxy = true};
    proxiedHttpClientHandler.Proxy = new WebProxy("proxy address");
    var httpClient = new HttpClient(proxiedHttpClientHandler)
    {
        BaseAddress = new Uri("uri");
        Timeout = 2000; //if you need timeout;
    }
}
_createHttpClient = () => ClientFactory();

Здесь есть хорошее обсуждение об использовании фабрики вместо создания экземпляра объекта httpClient вручную.

...