URL-адрес доступа к HttpClient с «@» (в символе)

#c# #url #dotnet-httpclient #.net-4.5.2

#c# #url #dotnet-httpclient #.net-4.5.2

Вопрос:

Я интегрирую службу, которая возвращает ключ при запросе GET на URL-адрес в следующем формате:

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

Когда я получаю доступ к URL-адресу в своем браузере, он возвращает новый ключ, как и ожидалось, когда я выполняю запрос GET, используя HttpClient , я получаю 401.

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

Я думаю, что это как-то связано с '@' в URL, но я не уверен, как это исправить, я попытался заменить его '@' , но когда я это делаю, я получаю UriFormatException .

Кто-нибудь знает, как это сделать?

Комментарии:

1. URI с username:password учетными данными необходимо преобразовать в запросы с использованием базовой аутентификации: baeldung.com/httpclient-4-basic-authentication

Ответ №1:

Вам следует изменить заголовок авторизации HttpClient, можете ли вы попробовать приведенный ниже код;

 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 запросы — это базовый запрос на аутентификацию, поэтому на самом деле вы пытаетесь выполнить базовый запрос на аутентификацию.

Надеюсь, это сработает для вас

Ответ №2:

Вам не нужно указывать учетные данные в 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");
    }
}