代码如下:
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
类时,相同的代理设置可以正常工作
发布于 2015-06-03 04:24:59
您在错误的位置设置了代理凭据。
httpClientHandler.Credentials是您在代理建立连接后提供给服务器的凭据。如果你弄错了,你可能会得到401或403的响应。
您需要设置提供给proxy的凭据,否则它将首先拒绝将您连接到服务器。您提供给代理的凭据可能与提供给服务器的凭据不同。如果你弄错了,你会得到一个407响应。你会得到一个407,因为你从来没有设置过这些。
// 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);
发布于 2019-02-21 07:56:25
您需要传递一个代理处理程序。试试这个,它对我很有效
var handler = new HttpClientHandler();
handler.DefaultProxyCredentials = CredentialCache.DefaultCredentials;
var client = new HttpClient(handler);
HttpResponseMessage response = await client.SendAsync();
发布于 2015-06-03 04:40:18
我发现了一些关于这个here from social.msdn.microsoft.com的有用信息。根据我所做的回复、测试和对System.Net.WebProxy Class的研究,您需要将代理凭据传递到代理对象,而不是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。
https://stackoverflow.com/questions/29856543
复制相似问题