#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");
}
}