HttpClient и использование прокси - постоянно получая 407
Вот код:
HttpClient client = null;
HttpClientHandler httpClientHandler = new HttpClientHandler()
{
Proxy = new WebProxy(string.Format("{0}:{1}", proxyServerSettings.Address,
proxyServerSettings.Port),false),
PreAuthenticate = true,
UseDefaultCredentials = false,
};
this.httpClientHandler.Credentials = new NetworkCredential(proxyServerSettings.UserName,
proxyServerSettings.Password);
this.client = new HttpClient(this.httpClientHandler);
И когда я, наконец, сделаю это:
HttpResponseMessage httpResponseMessage = this.client.PostAsync(urlToPost, new StringContent(data, Encoding.UTF8, this.mediaType)).Result;
Он всегда выбрасывает
Удаленный сервер ответил на ошибку: (407) Аутентификация прокси Обязательный параметр.
Которое я не понимаю для меня.
Тот же самый прокси-сервер работает отлично, когда настроен в IE10, или вместо этого я использую класс HttpWebRequest
Ответы
Ответ 1
Вы устанавливаете учетные данные прокси-сервера не в том месте.
httpClientHandler.Credentials - это учетные данные, которые вы предоставляете серверу после того, как прокси-сервер уже установил соединение. Если вы ошибетесь, вы, вероятно, получите ответ 401 или 403.
Вам необходимо установить учетные данные, данные прокси-серверу, иначе он в первую очередь откажется подключить вас к серверу. Учетные данные, которые вы предоставляете прокси-серверу, могут отличаться от тех, которые вы предоставляете серверу. Если вы ошибетесь, вы получите 407 ответ. Вы получаете 407, потому что вы никогда не устанавливали их вообще.
// First create a proxy object
var proxy = new WebProxy
{
Address = new Uri($"http://{proxyHost}:{proxyPort}"),
BypassOnLocal = false,
UseDefaultCredentials = false,
// *** These creds are given to the proxy server, not the web server ***
Credentials = new NetworkCredential(
userName: proxyUserName,
password: proxyPassword)
};
// Now create a client handler which uses that proxy
var httpClientHandler = new HttpClientHandler
{
Proxy = proxy,
};
// Omit this part if you don't need to authenticate with the web server:
if (needServerAuthentication)
{
httpClientHandler.PreAuthenticate = true;
httpClientHandler.UseDefaultCredentials = false;
// *** These creds are given to the web server, not the proxy server ***
httpClientHandler.Credentials = new NetworkCredential(
userName: serverUserName,
password: serverPassword);
}
// Finally, create the HTTP client object
var client = new HttpClient(handler: httpClientHandler, disposeHandler: true);
Ответ 2
Вам необходимо передать обработчик прокси. попробуй это у меня сработало
var handler = new HttpClientHandler();
handler.DefaultProxyCredentials = CredentialCache.DefaultCredentials;
var client = new HttpClient(handler);
HttpResponseMessage response = await client.SendAsync();
Ответ 3
Я нашел некоторую полезную информацию об этом здесь от social.msdn.microsoft.com. Из ответов, тестов, которые я сделал, и исследования класса System.Net.WebProxy вы должны передать учетные данные прокси в объект прокси, а не в HttpClientHandler.
{
Proxy = new WebProxy(string.Format("{0}:{1}", proxyServerSettings.Address,
proxyServerSettings.Port),false),
PreAuthenticate = true,
UseDefaultCredentials = false,
Credentials = new System.Net.NetworkCredential(proxyServerSettings.UserName,
proxyServerSettings.Password),
};
На самом деле это предназначено для аутентификации соединения с прокси, а не с HttpClientHandler.
Ответ 4
У меня та же проблема с приложением .NET Core. Ни одно из приведенных выше предложений не сработало, когда я пытаюсь вызвать службу SOAP из приложения .NET Core.
Есть предложения по решению этой проблемы в приложении .NET Core?