ChatGPT解决这个技术问题 Extra ChatGPT

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

我不明白我的世界。

在 IE10 中配置或我使用 HttpWebRequest 类时,相同的代理设置工作得很好


T
Tim

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

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

您需要设置提供给代理的凭据,否则它将首先拒绝将您连接到服务器。您提供给代理的凭据可能与您提供给服务器的凭据不同。如果你弄错了,你会得到一个 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);

我收到无效的 URI:URI 方案无效。 Mono 中的异常
您必须更改 Address = new Uri($"http://{proxyHost}:{proxyPort}"), 。如果您收到 URI 错误。
@Daryl 如何将代理设置为每个请求的可选?例如我有启用代理或禁用的复选框
它适用于服务器没有互联网的桌面和服务器代理
j
jo_va

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

var handler = new HttpClientHandler();
handler.DefaultProxyCredentials = CredentialCache.DefaultCredentials;

var client = new HttpClient(handler);

HttpResponseMessage response = await client.SendAsync();

我发现这个答案可以简单快速地应用。 tnx
D
DGaspar

我发现了一些关于这个 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。


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅