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 处理程序。仅构造对象并不会改变另一个客户端的路由策略。

相关文章