#c# #dotnet-httpclient #httpclientfactory
#c# #dotnet-httpclient #httpclientfactory
Вопрос:
Задача состоит в том, чтобы настроить прокси-сервер HttpClient в зависимости от URL-адреса. Например, если URL-адрес содержит «hostname.com», должно быть установлено.
Какова наилучшая практика?
Является ли следующее решением?
например, регистрируйте различные HttpClients в DI как:
-- Configured typed HttpClients with different proxies for each service services.AddHttpClientlt;Service1gt;().ConfigurePrimaryHttpMessageHandler(GetHttpHandlerSetter(s =gt; s.Service1)); services.AddHttpClientlt;Service2gt;().ConfigurePrimaryHttpMessageHandler(GetHttpHandlerSetter(s =gt; s.Service2)); -- Configured named HttpClient without proxy services.AddHttpClient("NoProxy");
И Service1 и Service2 разрешат IHttpClientFactory:
public class Service1 { readonly IHttpClientFactory _httpClientFactory; public IdgwConnectorManager(IHttpClientFactory httpClientFactory) { _httpClientFactory = httpClientFactory; } public void Get(string url) { if (url...) { _httpClientFactory.CreateClient(nameof(Service1)); } else { _httpClientFactory.CreateClient("NoProxy"); } } }
Комментарии:
1. Я бы использовал RestSharp и установил для этого Webproxy. Пример, если с помощью webproxy с нулевыми или полными данными, решит проблему
Ответ №1:
Вы хотите создать клиент, который можно было бы настроить в одном месте. Поэтому вам следует создать службу, которая будет принимать в качестве параметра ctor http-клиент, и в этом месте вы сможете настроить ее для своих нужд.
Примечание. Типизированные клиенты являются хорошими кандидатами для одной внутренней конечной точки. В случае прокси-клиентов я бы вместо этого использовал именованных клиентов. И я бы использовал словарь для хранения имени клиента со значением прокси.
Что касается того, как вы можете использовать созданный вами типизированный клиент, то более надежным решением было бы следующее:
public class Service1 { private readonly HttpClient _httpClient; public Service1(HttpClient client) { _httpClient = httpClient; // here you can setup headers, base address } //encapsulate all logic dealing with the endpoint. }
Теперь, работая с DI, вы можете ввести этот типизированный клиент в класс потребителей , и оттуда вы сможете решить, требуется ли прокси-клиент или не прокси-клиент.
public class ConsumerClass { //The typed client can be injected and consumed directly private readonly Service1 _service; public ConsumerClass(Service1 service) { _service= service; } //Consume Service1 }