Разрешение HttpClient зависит от URL (с/без прокси)

#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 }