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