postasjsonasync defaultrequestheaders authenticationheadervalue c# .net proxy httpclient

c# - defaultrequestheaders - HttpClient y el uso de proxy-obteniendo constantemente 407



proxy httpclient c# (2)

Aquí está el código:

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);

Y cuando finalmente haga esto:

HttpResponseMessage httpResponseMessage = this.client.PostAsync(urlToPost, new StringContent(data, Encoding.UTF8, this.mediaType)).Result;

Siempre tira el

El servidor remoto devolvió un error: (407) Autenticación de proxy requerida.

Que no entiendo por mi mundo.

La misma configuración de proxy funciona bien cuando se configura en IE10 o si utilizo la clase HttpWebRequest lugar


Encontré información útil sobre esto aquí en social.msdn.microsoft.com . A partir de las respuestas, las pruebas que hice y la investigación en la clase System.Net.WebProxy , necesitas pasar las credenciales del proxy al objeto proxy, no al 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), };

En realidad, esto está destinado a autenticar la conexión al proxy, no a HttpClientHandler.


Estás configurando las credenciales de proxy en el lugar equivocado.

httpClientHandler.Credentials son las credenciales que le da al servidor una vez que el proxy ya ha establecido una conexión. Si se equivoca, probablemente obtendrá una respuesta 401 o 403.

Debe establecer las credenciales asignadas al proxy o, en primer lugar, se negará a conectarse con el servidor. Las credenciales que le proporciona al proxy pueden ser diferentes de las que le proporciona al servidor. Si te equivocas, obtendrás una respuesta 407. Estás recibiendo un 407 porque nunca configuraste estos para nada.

// First create a proxy object var proxy = new WebProxy() { Address = new Uri($"{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);