首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >HttpClient和使用代理-不断获得407

HttpClient和使用代理-不断获得407
EN

Stack Overflow用户
提问于 2015-04-25 04:07:40
回答 3查看 116.1K关注 0票数 71

代码如下:

代码语言:javascript
复制
 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);

当我最终做到这一点时:

代码语言:javascript
复制
HttpResponseMessage httpResponseMessage = this.client.PostAsync(urlToPost, new StringContent(data, Encoding.UTF8, this.mediaType)).Result;

它总是抛出

远程服务器返回错误:(407)需要代理身份验证。

这对我来说是不能理解的。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-03 04:24:59

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

httpClientHandler.Credentials是您在代理建立连接后提供给服务器的凭据。如果你弄错了,你可能会得到401或403的响应。

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

代码语言:javascript
复制
// 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);
票数 152
EN

Stack Overflow用户

发布于 2019-02-21 07:56:25

您需要传递一个代理处理程序。试试这个,它对我很有效

代码语言:javascript
复制
var handler = new HttpClientHandler();
handler.DefaultProxyCredentials = CredentialCache.DefaultCredentials;

var client = new HttpClient(handler);

HttpResponseMessage response = await client.SendAsync();
票数 17
EN

Stack Overflow用户

发布于 2015-06-03 04:40:18

我发现了一些关于这个here from social.msdn.microsoft.com的有用信息。根据我所做的回复、测试和对System.Net.WebProxy Class的研究,您需要将代理凭据传递到代理对象,而不是HttpClientHandler。

代码语言:javascript
复制
{
    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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29856543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档