代理 URL 的 UserInfo 并不是 WebProxy.Credentials
在创建 NetworkCredential 之前,先从 HTTP 代理 URI 中提取并解码用户信息。
WebProxy 的 URI 构造函数只选择一个终结点,不会用该 URI 中的用户信息填充 Credentials。对于经应用程序校验的 HTTP 代理 URL:
var uri = new Uri(proxyUrl);
var endpoint = new UriBuilder(uri)
{
UserName = "",
Password = ""
};
var proxy = new System.Net.WebProxy(endpoint.Uri);
if (uri.UserInfo.Length > 0)
{
var parts = uri.UserInfo.Split(new[] { ':' }, 2);
var username = Uri.UnescapeDataString(parts[0]);
var password = parts.Length == 2
? Uri.UnescapeDataString(parts[1])
: "";
proxy.Credentials =
new System.Net.NetworkCredential(username, password);
}
proxyUrl 是传入的代理 URL,而不是网站 URL。Uri 会解析其中的 authority,而 UriBuilder 会把用户信息从存入 WebProxy 的终结点中移除。
在解码各组成部分之前,请先按第一个字面冒号拆分。这样既能保留用户名中已编码的冒号,又能保留密码中额外的冒号。每个组成部分只解码一次;不要用 Base64 编码密码来替代 URL 转义。
最后,在该处理程序发出请求之前,把 proxy 赋给目标 HTTP 处理程序。仅构造对象并不会改变另一个客户端的路由策略。