Ошибка отправки HttpClient SendAsync — ResponseStatusCode не указывает на успех

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