Держите отдельный обработчик .NET для каждой прокси-учётной записи
Создавайте отдельные обработчики для одновременных учётных записей вместо замены WebProxy.Credentials на транспорте, который уже обслуживает запросы.
Транспорт может сохранять объект поставщика прокси-учётных данных, выбранный при создании его менеджера пула. Замена WebProxy.Credentials после этого не является надёжной операцией переключения учётной записи.
Создайте маршрут и учётную запись вместе, прежде чем использовать клиент:
var proxy = new System.Net.WebProxy(proxyEndpoint)
{
Credentials = new System.Net.NetworkCredential(proxyUser, proxyPassword)
};
var handler = new System.Net.Http.HttpClientHandler
{
UseProxy = true,
Proxy = proxy
};
var client = new System.Net.Http.HttpClient(handler);Конечная точка и учётные данные берутся из конфигурации приложения. Для второй личности создайте другой обработчик; другой HttpClient, использующий первый обработчик, использует и его политику.
Пользовательский поставщик ICredentials может отвечать на последующие вызовы, но не может переобозначить установленный туннель как другую учётную запись. Назначение одного глобального имени пользователя/пароля вокруг асинхронных вызовов оставляет время вызова и принадлежность учётной записи в конфликте.
При необходимости повторного использования держите ограниченный набор клиентов. Слейте старую работу перед освобождением её транспорта. Новый обработчик на каждый запрос расходует пулы соединений; хранение всех исторических учётных записей навсегда растит их без границы.