C# HttpClient 代理接入示例
使用 .NET HttpClient、WebProxy、代理账密和请求超时完成 HTTPS 访问。
只只HTTP技术团队维护更新于 2026年7月31日
.NET 应用可以通过 HttpClientHandler.Proxy 绑定 WebProxy。示例将代理地址和凭据拆开读取,便于凭据轮换和日志脱敏。
前置条件
- 调用方项目使用支持
HttpClient的当前 .NET 运行时。 - 通过受控环境注入
PROXY_HOST、PROXY_PORT、PROXY_USERNAME和PROXY_PASSWORD。 - 长生命周期服务通过依赖注入或客户端工厂管理连接复用。
完整示例
using System.Net;
var proxyHost = Environment.GetEnvironmentVariable("PROXY_HOST")
?? throw new InvalidOperationException("Missing PROXY_HOST");
var proxyPort = Environment.GetEnvironmentVariable("PROXY_PORT")
?? throw new InvalidOperationException("Missing PROXY_PORT");
var proxyUsername = Environment.GetEnvironmentVariable("PROXY_USERNAME")
?? throw new InvalidOperationException("Missing PROXY_USERNAME");
var proxyPassword = Environment.GetEnvironmentVariable("PROXY_PASSWORD")
?? throw new InvalidOperationException("Missing PROXY_PASSWORD");
var proxy = new WebProxy(new Uri($"http://{proxyHost}:{proxyPort}"))
{
Credentials = new NetworkCredential(proxyUsername, proxyPassword),
};
using var handler = new HttpClientHandler
{
Proxy = proxy,
UseProxy = true,
};
using var client = new HttpClient(handler)
{
Timeout = TimeSpan.FromSeconds(30),
};
using var response = await client.GetAsync("https://<public-test-host>/ip");
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
预期结果
- HTTPS 请求通过配置的 HTTP 代理建立隧道。
EnsureSuccessStatusCode在目标返回错误状态时抛出异常。- 生产服务复用客户端及处理器,不在高频请求中重复创建连接池。
错误处理
- 407 检查
NetworkCredential的用户名、密码和当前权益。 TaskCanceledException需要结合取消令牌判断是主动取消还是请求超时。HttpRequestException的状态与内部异常应分层记录,但不得包含凭据。
安全提示
不要把 WebProxy、环境变量或完整异常请求序列化到日志。凭据更新后应淘汰旧处理器和连接,确保后续请求使用新身份。
这篇内容解决了你的问题吗?
反馈只用于改进公开文档,不会提交账号或请求信息。