Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

HttpClient and using proxy - constantly getting 407

Here is the code:

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

And when I finally do this:

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

It always throws the

The remote server returned an error: (407) Proxy Authentication Required.

Which I do not understand for the world of me.

The same proxy set up works just fine when is configured in IE10 or if I use the HttpWebRequest class instead

like image 971
dexter Avatar asked Apr 24 '15 20:04

dexter


People also ask

What is HttpClient proxy?

Hyper Text Transfer Protocol (HTTP) is a request/response protocol between clients and servers. The HTTP client is usually a web browser. The HTTP server is a remote resource that stores HTML files, images, and other content.

What is HttpClientHandler C#?

The HttpClient class uses a message handler to process the requests on the client side. The default handler provided by the dot net framework is HttpClientHandler. This HTTP Client Message Handler sends the request over the network and also gets the response from the server.


1 Answers

You're setting the proxy credentials in the wrong place.

httpClientHandler.Credentials are the credentials you give to the server after the proxy has already established a connection. If you get these wrong, you'll probably get a 401 or 403 response.

You need to set the credentials given to the proxy, or it will refuse to connect you to the server in the first place. The credentials you provide to the proxy may be different from the ones you provide to the server. If you get these wrong, you'll get a 407 response. You're getting a 407 because you never set these at all.

// First create a proxy object var proxy = new WebProxy {     Address = new Uri($"http://{proxyHost}:{proxyPort}"),     BypassProxyOnLocal = 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); 
like image 95
Daryl Avatar answered Oct 11 '22 19:10

Daryl