UserInfo в URL прокси — это не WebProxy.Credentials
Извлеките и декодируйте данные пользователя из URI HTTP-прокси до создания NetworkCredential.
Конструктор URI в WebProxy выбирает только конечную точку; он не заполняет Credentials данными пользователя из этого URI. Для HTTP-прокси URL, проверяемого приложением:
var uri = new Uri(proxyUrl);
var endpoint = new UriBuilder(uri)
{
UserName = "",
Password = ""
};
var proxy = new System.Net.WebProxy(endpoint.Uri);
if (uri.UserInfo.Length > 0)
{
var parts = uri.UserInfo.Split(new[] { ':' }, 2);
var username = Uri.UnescapeDataString(parts[0]);
var password = parts.Length == 2
? Uri.UnescapeDataString(parts[1])
: "";
proxy.Credentials =
new System.Net.NetworkCredential(username, password);
}
proxyUrl — это переданный URL прокси, а не URL сайта. Uri разбирает его authority, а UriBuilder удаляет данные пользователя из конечной точки, сохраняемой в WebProxy.
Разделите по первому буквальному двоеточию до декодирования компонентов. Это сохраняет закодированное двоеточие в имени пользователя и оставляет дополнительные двоеточия пароля в пароле. Декодируйте каждый компонент один раз; не кодируйте пароль в Base64 вместо экранирования URL.
Наконец, назначьте proxy нужному HTTP-обработчику до того, как он начнёт отправлять запросы. Само создание объекта не меняет политику маршрутизации другого клиента.