Как настроить веб-прокси для HttpClient, созданного напрямую через HttpClientFactory?

  • Под прямым я подразумеваю без помощников Asp.Net Core IoC / DI.

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

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

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


person Bruno Fiorentino    schedule 26.09.2018    source источник


Ответы (2)


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

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

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);

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

person Nkosi    schedule 26.09.2018
comment
Я не использую Asp .Net Core IoC / DI и его помощников. Мне нужно настроить и использовать HttpClientFactory напрямую. - person Bruno Fiorentino; 27.09.2018
comment
Итак, как вы собираетесь создать фабрику? Вы знаете, что можете создать коллекцию услуг самостоятельно и получить преимущества от поставщика услуг? - person Nkosi; 27.09.2018
comment
Я не создаю коллекцию услуг. В этом-то и дело. Это проект на основе шаблона консольного приложения (новая консоль dotnet), не имеющий отношения к Asp .Net Core. Мне нужно напрямую использовать HttpClientFactory и HttpClient. - person Bruno Fiorentino; 27.09.2018
comment
Это нормально, если это вариант, но мой вопрос о том, как это сделать без инфраструктуры IoC / DI для сбора сервисов. Это не должно быть сложно. - person Bruno Fiorentino; 27.09.2018
comment
Хорошо понял. это пример консоли с DI. github.com/aspnet/HttpClientFactory/blob/master/samples/ я проверю, есть ли без него. - person Nkosi; 27.09.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();

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

person Ben    schedule 26.09.2018
comment
Я реализую диспетчер http. Он вызывается в цикле приема сообщений и отправляется на веб-перехватчики. Я предполагаю, что я должен использовать HttpClientFactory: docs.microsoft.com/en-us/dotnet/standard/ - person Bruno Fiorentino; 27.09.2018