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)需要代理身份validation。

对于我这个世界,我不明白。

在IE10中配置或者我使用HttpWebRequest类时,相同的代理设置工作正常

您将代理凭据设置在错误的位置。

httpClientHandler.Credentials是代理已建立连接后您为服务器提供的凭据。 如果你弄错了,你可能会收到401或403的回复。

您需要设置给代理的凭据,否则它将首先拒绝将您连接到服务器。 您提供给代理的凭据可能与您提供给服务器的凭据不同。 如果你弄错了,你会得到407回复。 你得到的是407,因为你从来没有设置过这些。

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

我在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), }; 

这实际上是为了validation与代理的连接,而不是HttpClientHandler。