#c# #dotnet-httpclient #sendasync
#c# #dotnet-httpclient #отправка синхронизации
Вопрос:
Я новичок в написании универсальных методов на C #, и я пытаюсь создать универсальный SendAsync
метод в моем проекте c #. Код приведен ниже.
HttpClientHelper.cs
public static async Task<TOut> ExecuteRequest<TIn,TOut>(TIn request, string url)
{
Uri requestUri = new Uri(url);
string payload = JsonConvert.SerializeObject(request);
HttpContent httpContent = new StringContent(payload, Encoding.UTF8, "application/json");
HttpRequestMessage requestMessage = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = requestUri,
Content = httpContent
};
return await SendUriAsync<TOut>(requestMessage);
}
public static async Task<T> SendUriAsync<T>(HttpRequestMessage requestMessage)
{
CancellationTokenSource source = new CancellationSource();
CancellationToken token = source.Token;
string client_id = "1234";
using (var client = new HttpClient())
{
var clientCred = Encoding.UTF8.GetBytes($"{client_id}");
client.DefaultRequestHeaders.Add("Authorization", "Basic " Convert.ToBase64String(clientCred));
using(var result = await client.SendAsync(requestMessage, token))
{
result.EnsureSuccessStatusCode();
var response = await result.Content.ReadAsStringAsync();
if(result.IsSuccessStatusCode amp;amp; response != null)
{
return JsonConvert.DeserializeObject<T>(response);
}
else
{
throw new ApiException{ status = (int)result.StatusCode};
}
}
}
}
Вот класс контроллера, который вызывает эти методы:
CarSalesController.cs
string thirdpartyUrl = "someurl";
var responseObject = await HttpClientHelper.ExecuteRequest<CarObject, string>(requestObject, thirdpartyUrl);
Я получаю ошибку в HttpClientHelper
классе. Ошибка заключается в:
ResponseStatusCode не указывает на успех. StatusCode: 401 — неавторизованный
Но тот же API работает хорошо, когда я использую postman. Вот завиток
curl —location —request GET ‘someurl’
—header ‘client_id: 1234’
—header ‘Авторизация: базовый asdf’
—header ‘Тип содержимого: application / json’
—data-raw ‘{ «data1»: «somedata1», «data2″:»somedata2» }’
Что может быть не так в моем коде?
Комментарии:
1. Убедитесь, что часть base64 заголовка auth такая же, как в postman.
Ответ №1:
Попробуйте
request.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue(
"Basic", Convert.ToBase64String(
System.Text.ASCIIEncoding.ASCII.GetBytes(
$"{client_id}")));
Комментарии:
1. Как бы это помогло?
Encoding.ASCII
возвращаетASCIIEncoding
7-разрядный диапазон US-ASCII, который идентичен тому же диапазону в UTF8. Этот код заменит любые символы за пределами этого диапазона на?
, таким образом искажая значение2. @PanagiotisKanavos вместо этого используется значение AuthenticationHeaderValue, это главное.
3. И именно поэтому ответы только с кодом не считаются хорошими ответами. Нужно было бы изменить код, чтобы выяснить, что изменилось, и наиболее заметным отличием является ошибка
Ответ №2:
вам нужно использовать
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
Вместо
client.DefaultRequestHeaders.Add("Authorization", "Basic " Convert.ToBase64String(clientCred));
Например :
static async void HTTP_GET()
{
var TARGETURL = "http://en.wikipedia.org/";
HttpClientHandler handler = new HttpClientHandler()
{
Proxy = new WebProxy("http://127.0.0.1:8888"),
UseProxy = true,
};
Console.WriteLine("GET: " TARGETURL);
// ... Use HttpClient.
HttpClient client = new HttpClient(handler);
var byteArray = Encoding.ASCII.GetBytes("username:password1234");
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
HttpResponseMessage response = await client.GetAsync(TARGETURL);
HttpContent content = response.Content;
// ... Check Status Code
Console.WriteLine("Response StatusCode: " (int)response.StatusCode);
// ... Read the string.
string result = await content.ReadAsStringAsync();
// ... Display the result.
if (result != null amp;amp;
result.Length >= 50)
{
Console.WriteLine(result.Substring(0, 50) "...");
}
}
Комментарии:
1. Я сохранил bytearray в clientCreds. var clientCred = Encoding.UTF8. getBytes($»{client_id}»);