HttpClient 访问 url 使用 '@'(at 符号)

HttpClient access url with '@' (at symbol)

当我向 URL 发出 GET 请求时,我正在集成一个 returns 密钥的服务,格式如下:

https://username:password@service.com/refresh.key

当我在浏览器中访问 URL 时,它 returns 是预期的新密钥,当我使用 HttpClient 执行 GET 请求时,我得到了 401。

HttpClient _client = new HttpClient();
var response = await _client.GetAsync(@"https://username:password@service.com/refresh.key"); // Returns a 401

我认为它与URL中的'@'有关,但我不确定如何修复它,我尝试将其替换为'%40',但是当我这样做时,我得到一个 UriFormatException.

有人知道怎么做吗?

您无需在 url 中提供凭据。相反,您可以这样做:

using (var handler = new HttpClientHandler {Credentials = new NetworkCredential("username", "password")}) {
    using (HttpClient _client = new HttpClient(handler)) {
          var response = await _client.GetAsync(@"https://service.com/refresh.key");
    }
}

你应该修改HttpClient的Authorization header,你可以试试下面的代码;

HttpClient _client = new HttpClient();
byte[] usernamePasswordBytes = Encoding.ASCII.GetBytes("user:pass");
_client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(usernamePasswordBytes));
var response = await _client.GetAsync(@"https://service.com/refresh.key");

PS: 这样的 username:pass@domain.com 请求是 BasicAuthentication 请求所以实际上你尝试进行基本身份验证请求。

希望这对你有用