Flurl Proxy после строительства? - PullRequest
0 голосов
/ 19 апреля 2019

Я использую Flurl для использования API в моем приложении, и у меня есть вопрос о прокси.Дело в том, что я хочу, чтобы пользователь мог устанавливать прокси-сервер при необходимости после запуска, возможно ли это с помощью Flurl?

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

По сути, я хочу, чтобы по умолчанию сначала не было прокси, как это происходити использовать это для всех запросов.Потом, когда-нибудь позже, если пользователь настроит прокси и введет данные, я хочу иметь возможность установить прокси для Flurl и использовать его для всех последующих запросов.

Есть ли способ сделать это?

1 Ответ

1 голос
/ 19 апреля 2019

Короткий ответ: вам нужно будет создавать нового клиента каждый раз, когда прокси-сервер установлен или изменен.Это связано с ограничениями в цепочке зависимостей:

  1. Информация прокси установлена ​​в HttpClientHandler.
  2. Обработчик передается конструктору HttpClient и не может быть изменен после этого..
  3. FlurlClient упаковывает ровно один HttpClient, который либо передается явно через его конструктор, либо (более типично) создается лениво с помощью его правил по умолчанию или пользовательских , настроенных через настройки и фабрики .После создания он не может быть изменен.
  4. Даже если вы сохранили ссылку на HttpClientHandler и попытались изменить ее настройки прокси-сервера в более поздний момент, вы получите ошибка времени выполнения .

Если вы в настоящее время явно не используете FlurlClient, я бы переключился на эту парадигму.Вот пример того, что должно произойти, когда пользователь меняет прокси:

var hch = new HttpClientHandler {
    UseProxy = true,
    Proxy = new WebProxy(proxyUrl)
};
var hc = new HttpClient(hch) { BaseAddress = baseUrl };
var fc = new FlurlClient(hc);

Затем вы можете свободно создавать вызовы fc, как если бы вы начинали с URL:

var thing = await fc.Request("path", "to", "endpoint").GetJsonAsync<T>();

В зависимости от того, есть ли у вас несколько одновременно работающих пользователей или одновременных вызовов, вы можете сделать это немного более надежным, инкапсулировав его в нечто, что кэширует FlurlClient экземпляров на адрес прокси, например, с помощью ConcurrentDictionay.

...