Подтвердить что ты не робот

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

4b9b3361

Ответ 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?