在继续编写代码之前,请访问 Free Proxy List 网站并选择离您所在位置最近的代理。本示例中,我将选择一个位于德国的代理。请记下所选代理的 IP 地址和端口。
要在 HttpClient 中使用代理,我们需要创建一个 HttpClientHandler 实例。在此实例中,我们需要设置两个属性:代理 URL 和端口,以及 `ServerCertificateCustomValidationCallback`。虽然这个变量名很长,但它非常重要。
`ServerCertificateCustomValidationCallback` 指示 HttpClientHandler 忽略任何 HTTPS 证书错误。您可能想知道为什么要这样做。
代理服务器会在将流量转发至目标服务器之前,拦截并检查流量(包括 HTTPS 证书)。因此,目标服务器向代理服务器展示的证书可能与向客户端展示的证书不同。
默认情况下,HttpClient 及其他类似库会验证目标服务器提供的证书,若证书无效或与客户端收到的证书不匹配,则会抛出异常。这就是证书错误的来源。
在使用代理模式时忽略 HTTPS 证书错误,即使证书无效也能让请求继续进行,这在某些情况下非常有用,例如当证书被代理服务器拦截并修改时。
现在是时候编写代码了。让我们从 HttpClientHandler 实例开始:
using System.Net;
using var httpClientHandler = new HttpClientHandler
{
Proxy = new WebProxy("http://5.9.139.204:24000"),
ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
};
我们需要向 HttpClient 类提供一个 HttpClientHandler 实例。修改后的客户端代码应如下所示:
using var client = new HttpClient(httpClientHandler);
完整的代码应如下所示:
using System.Net;
using var httpClientHandler = new HttpClientHandler
{
Proxy = new WebProxy("http://5.9.139.204:24000"),
ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
};
using var client = new HttpClient(httpClientHandler);
var result = await client.GetStringAsync("https://api.ipify.org?format=json");
Console.WriteLine(result);
运行代码后,返回的将是代理 IP 地址而非您的 IP 地址。您可以在浏览器中打开 ipify 网址并对比结果。