Отправка запросов .NET HttpClient через прокси
Настройте WebProxy в HttpClientHandler и не оставляйте прокси отключённым или привязанным к другому клиенту.
Запрос должен использовать HttpClient, созданный с вашим обработчиком прокси. Создание отдельного объекта WebProxy не меняет маршрут другого клиента.
using System;
using System.Net;
using System.Net.Http;
var proxy = new WebProxy("http://203.0.113.10:8080")
{
BypassProxyOnLocal = false
};
using var handler = new HttpClientHandler
{
Proxy = proxy,
UseProxy = true
};
using var client = new HttpClient(handler)
{
Timeout = TimeSpan.FromSeconds(15)
};
using var response = await client.GetAsync("https://example.com/");
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());Замените документационный адрес реальным HTTP-прокси вашего сервиса или из списка HTTP-прокси. Этот синтаксис верхнего уровня подходит современному консольному проекту C#; в старых проектах операторы можно поместить в асинхронный Main.
Проверьте оба свойства обработчика: Proxy выбирает конечную точку, а UseProxy=true включает её использование. Если точка работает отдельно, но не в приложении, убедитесь, что код не отключает UseProxy и вызов использует именно этот экземпляр. Выделенный обработчик устраняет зависимость от обнаружения настроек процессом или ОС.
Если оператор прокси предоставляет учётную запись, назначьте NetworkCredential свойству WebProxy.Credentials. Authorization сайта относится к другому звену, а публичная запись IP:port не даёт стандартных данных входа. Слушающий узел http:// может передавать HTTPS по туннелю; сохраняйте обычную проверку цели.
Эта короткая программа освобождает объекты при выходе. Для повторных вызовов сервиса следуйте рекомендациям .NET по времени жизни клиента и сохраняйте клиент/обработчик под нагрузку, а не пересоздавайте пулы соединений для каждого запроса. Проверяйте возвращённый статус: исправный маршрут прокси всё равно может передать отказ сайта.