Ustawianie nagłówka autoryzacji HttpClient


483

Mam HttpClient, którego używam dla interfejsu API REST. Mam jednak problem z ustawieniem nagłówka autoryzacji. Muszę ustawić nagłówek na token, który otrzymałem od wykonania mojego żądania OAuth. Widziałem trochę kodu dla .NET, który sugeruje następujące,

httpClient.DefaultRequestHeaders.Authorization = new Credential(OAuth.token);

Jednak klasa poświadczeń nie istnieje w WinRT. Czy ktoś ma jakieś pomysły, jak ustawić nagłówek autoryzacji?


1
Do jakiej przestrzeni nazw należy klasa poświadczeń?
kampsj

@kampsj Nie wiem, ponieważ jest to przestrzeń nazw .NET, która nie istnieje w WinRT
Stephen Hynes

1
Dlaczego nie request.Headers.Add („Autoryzacja”, token);
wszyscy

Odpowiedzi:


815

Sposób na zrobienie tego jest następujący:

httpClient.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", "Your Oauth token");

14
jak zdobyć „Twój token Oauth”?
Secret Squirrel

3
Użyłem: client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", "encrypted user/pwd");Pobieranie zaszyfrowanego użytkownika / pwd z rozszerzenia Chrome Advanced Rest Client.
Czerwony

6
@ Red fyi, drugim parametrem jest użytkownik zakodowany w standardzie base64: hasło (nie jest szyfrowane).
n00b

5
Moja aplikacja z radością używała tego od wieków, a potem niespodziewanie zacząłem otrzymywać wyjątek RuntimeBinderException. Musiałem przełączyć się na httpClient.DefaultRequestHeaders.Add („Autoryzacja”, „Nosiciel”, „Twój token Oauth”); żeby znów zacząć.
kraeg

8
@kraeg, kod, który wymieniłeś nie kompiluje się, czy miałeś na myśli konkatenację dwóch ostatnich ciągów takich jak: client.DefaultRequestHeaders.Add („Autoryzacja”, „Nośnik” + „Twój token Oauth”);
TroySteven,

354
request.DefaultRequestHeaders.Authorization = 
    new AuthenticationHeaderValue(
        "Basic", Convert.ToBase64String(
            System.Text.ASCIIEncoding.ASCII.GetBytes(
               $"{yourusername}:{yourpwd}")));

27
@MickyDuncan HttpClient ma DefaultRequestHeaders.Authorization. I ta odpowiedź uratowała mój dzień. Wielkie dzięki WhiteRabbit.
Joey Schluchter

3
To nie działa, jeśli sprawdzisz, że nagłówek Auhtorization nie zawiera niczego więcej niż ciąg Basic.
Raffaeu

1
Czy ktoś może wyjaśnić, dlaczego ważne jest przekonwertowanie nazwy użytkownika i hasła na ciąg base64? Nie oferuje prawdziwego szyfrowania, więc dlaczego to ma znaczenie?
Jonathan Wood

3
@JonathanWood Ponieważ to jest to, jak to jest zdefiniowane do użycia. Podstawowy nie oferuje szyfrowania, wystarczy kodowanie wystarczające, aby uniknąć problemów z wyborem znaków hasła w nagłówku.
Richard

4
Czy jest jakiś konkretny powód, dla którego użyłeś tutaj kodowania ASCII? Zakładam, że nie ma problemu z użyciem kodowania UTF8, ponieważ i tak kodujemy go w standardzie Base64. Myślę, że zastanawiam się, czy podstawowa specyfikacja uwierzytelniania mówi, że kombinacja nazwa użytkownika: hasło powinna być tylko w ASCII?
zmiażdżyć

82

Szukam dobrego sposobu na rozwiązanie tego problemu i patrzę na to samo pytanie. Mam nadzieję, że ta odpowiedź pomoże wszystkim, którzy mają ten sam problem, mnie lubią.

using (var client = new HttpClient())
{
    var url = "https://www.theidentityhub.com/{tenant}/api/identity/v1";
    client.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);
    var response = await client.GetStringAsync(url);
    // Parse JSON response.
    ....
}

referencja z https://www.theidentityhub.com/hub/Documentation/CallTheIdentityHubApi


1
Robię dokładnie to samo @willie i wciąż otrzymuję 401 z mojego API
Coś

2
Cześć @SomethingOn Myślę, że nie otrzymałeś prawidłowego klucza tokena, więc masz 401, podzielę się swoją drogą na moim osobistym „zadaj pytanie”, mam nadzieję, że może pomóc ci poradzić sobie z problemem. PS czeka na chwilę
Willie Cheng

14
Nie powinieneś umieszczać HttpClient w usingbloku. (Tak, wiem, że to brzmi odwrotnie, ale zepsujesz połączenia, jeśli użyjesz usingzamiast po prostu recyklingu HttpClient.)
Jonathan Allen

42

Ponieważ dobrą praktyką jest ponowne użycie instancji HttpClient , problemy z wydajnością i wyczerpaniem portów , a ponieważ żadna z odpowiedzi nie daje tego rozwiązania (a nawet prowadzi do złych praktyk :(), umieściłem tutaj link do odpowiedzi, którą podałem na podobne pytanie:

https://stackoverflow.com/a/40707446/717372

Niektóre źródła, w jaki sposób korzystać z HttpClient we właściwy sposób:


5
Problem wyczerpania portów to nie żart. Prawie nigdy nie zdarza się to podczas kontroli jakości, ale trafi na każdy mocno wykorzystywany projekt w produkcji.
Jonathan Allen

Zobacz mój post dla konkretnego przykładu stackoverflow.com/a/59052193/790635
emp

41

Zgadzam się z odpowiedzią TheWhiteRabbit, ale jeśli masz dużo połączeń za pomocą HttpClient, kod wydaje mi się nieco powtarzalny.

Myślę, że istnieją 2 sposoby, aby nieco poprawić odpowiedź.

Utwórz klasę pomocnika, aby utworzyć klienta:

public static class ClientHelper
{
    // Basic auth
    public static HttpClient GetClient(string username,string password)
    {
            var authValue = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes($"{username}:{password}")));

            var client = new HttpClient(){
                DefaultRequestHeaders = { Authorization = authValue}
                //Set some other client defaults like timeout / BaseAddress
            };
            return client;
    }

    // Auth with bearer token
    public static HttpClient GetClient(string token)
    {
            var authValue = new AuthenticationHeaderValue("Bearer", token);

            var client = new HttpClient(){
                DefaultRequestHeaders = { Authorization = authValue}
                //Set some other client defaults like timeout / BaseAddress
            };
            return client;
    }
}

Stosowanie:

using(var client = ClientHelper.GetClient(username,password))
{
    //Perform some http call
}

using(var client = ClientHelper.GetClient(token))
{
    //Perform some http call
}

Utwórz metodę rozszerzenia:

Nie wygrywa nagrody za urodę, ale działa świetnie :)

    public static class HttpClientExtentions
    {
        public static AuthenticationHeaderValue ToAuthHeaderValue(this string username, string password)
        {
            return new AuthenticationHeaderValue("Basic",
        Convert.ToBase64String(
            System.Text.Encoding.ASCII.GetBytes(
                $"{username}:{password}")));
        }
    }

Stosowanie:

using (var client = new HttpClient())
{
    client.DefaultRequestHeaders.Authorization = _username.ToAuthHeaderValue(_password); 
}

Ponownie myślę, że 2 powyższe opcje sprawiają, że klient używa instrukcji nieco mniej powtarzalny. Pamiętaj, że najlepszą praktyką jest ponowne użycie klienta HttpClient, jeśli wykonujesz wiele połączeń HTTP, ale myślę, że to trochę poza zakresem tego pytania.


20
widzę, że twoja odpowiedź jest pozytywnie oceniona, ale nie poleciłbym tego podejścia TL; DR jest po prostu błędne, ponieważ wyczerpanie gniazda, oto wyjaśnienie link
lacripta

2
@lacripta, To prawda, ale jeśli czytasz ostatnie 2 zdanie, mówię, że najlepszą praktyką jest ponowne użycie HttpClient z dokładnie tego powodu, ale myślę, że nie mieści się w zakresie tego pytania.
Florian Schaal,

1
rozumiem twój punkt widzenia, ale sugerujesz, że kod jest powtarzalny, może to prowadzić do niewłaściwego użycia tej metody fabrycznej, dobrze byłoby wskazać w pierwszych wierszach, że spowoduje to problemy z wykorzystaniem zasobów w przyszłości, specjalnie dla ta sprawa. a nie tylko ostrzeżenie, które większość nie przeczyta.
lacripta

1
Użycie HttpClientFactory byłoby znacznie lepsze, aby uniknąć problemu wyczerpania gniazda.
RyanOC

20

Ustawiałem token na okaziciela

httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

Działało w jednym punkcie końcowym, ale nie w drugim. Problem polegał na tym, że miałem małe litery bna"bearer" . Po zmianie teraz działa na oba api, które uderzam. Tak łatwo przeoczyć, jeśli nawet nie uważa się go za jeden ze stogów siana do szukania igły.

Upewnij się, że masz "Bearer"- z kapitałem.


17

Proponuję ci:

HttpClient.DefaultRequestHeaders.Add("Authorization", "Bearer <token>");

A potem możesz użyć tego w ten sposób:

var response = await client.GetAsync(url);
if (response.IsSuccessStatusCode)
{
    responseMessage = await response.Content.ReadAsAsync<ResponseMessage>();
}

Jeśli na przykład Twój limit czasu minie co 1 godzinę, musisz zaktualizować HttpClient za pomocą tego rozwiązania. Sugerowałbym sprawdzenie, czy Twój token jest nadal ważny, a w przeciwnym razie odświeżenie go i dodanie go do HttpRequestMessage
Johan Franzén

13

Aby ustawić podstawowe uwierzytelnianie za pomocą C # HttpClient. Poniższy kod działa dla mnie.

   using (var client = new HttpClient())
        {
            var webUrl ="http://localhost/saleapi/api/";
            var uri = "api/sales";
            client.BaseAddress = new Uri(webUrl);
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.ConnectionClose = true;

            //Set Basic Auth
            var user = "username";
            var password = "password";
            var base64String =Convert.ToBase64String( Encoding.ASCII.GetBytes($"{user}:{password}"));
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",base64String);

            var result = await client.PostAsJsonAsync(uri, model);
            return result;
        }

Właśnie tego potrzebowałem, dzięki.
rchrd

9

Oto jak to zrobiłem:

using (HttpClient httpClient = new HttpClient())
{
   Dictionary<string, string> tokenDetails = null;
   var messageDetails = new Message { Id = 4, Message1 = des };
   HttpClient client = new HttpClient();
   client.BaseAddress = new Uri("http://localhost:3774/");
   var login = new Dictionary<string, string>
       {
           {"grant_type", "password"},
           {"username", "sa@role.com"},
           {"password", "lopzwsx@23"},
       };
   var response = client.PostAsync("Token", new FormUrlEncodedContent(login)).Result;
   if (response.IsSuccessStatusCode)
   {
      tokenDetails = JsonConvert.DeserializeObject<Dictionary<string, string>>(response.Content.ReadAsStringAsync().Result);
      if (tokenDetails != null && tokenDetails.Any())
      {
         var tokenNo = tokenDetails.FirstOrDefault().Value;
         client.DefaultRequestHeaders.Add("Authorization", "Bearer " + tokenNo);
         client.PostAsJsonAsync("api/menu", messageDetails)
             .ContinueWith((postTask) => postTask.Result.EnsureSuccessStatusCode());
      }
   }
}

Ten film z you-tube bardzo mi pomaga. Proszę sprawdź to. https://www.youtube.com/watch?v=qCwnU06NV5Q


9

Użyj podstawowych uprawnień i parametrów Json.

using (HttpClient client = new HttpClient())
                    {
                        var request_json = "your json string";

                        var content = new StringContent(request_json, Encoding.UTF8, "application/json");

                        var authenticationBytes = Encoding.ASCII.GetBytes("YourUsername:YourPassword");

                        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
                               Convert.ToBase64String(authenticationBytes));
                        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                        var result = await client.PostAsync("YourURL", content);

                        var result_string = await result.Content.ReadAsStringAsync();
                    }

2
W takim przykładzie nie należy dołączać kodu, aby wyłączyć sprawdzanie certyfikatów SSL. Ludzie mogą ślepo kopiować kod, nie zdając sobie sprawy z jego działania. Usunąłem te linie dla ciebie.
Jan

9

Jeśli chcesz ponownie użyć HttpClient, zaleca się, aby nie używaćDefaultRequestHeaders ponieważ są one używane do wysyłania przy każdym żądaniu.

Możesz spróbować:

var requestMessage = new HttpRequestMessage
    {
        Method = HttpMethod.Post,
        Content = new StringContent("...", Encoding.UTF8, "application/json"),
        RequestUri = new Uri("...")
    };

requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Basic", 
    Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes($"{user}:{password}")));

var response = await _httpClient.SendAsync(requestMessage);

8

6 lat później, ale dodanie tego na wypadek, gdyby komuś to pomogło.

https://www.codeproject.com/Tips/996401/Authenticate-WebAPIs-with-Basic-and-Windows-Authen

var authenticationBytes = Encoding.ASCII.GetBytes("<username>:<password>");
using (HttpClient confClient = new HttpClient())
{
  confClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", 
         Convert.ToBase64String(authenticationBytes));
  confClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(Constants.MediaType));  
  HttpResponseMessage message = confClient.GetAsync("<service URI>").Result;
  if (message.IsSuccessStatusCode)
  {
    var inter = message.Content.ReadAsStringAsync();
    List<string> result = JsonConvert.DeserializeObject<List<string>>(inter.Result);
  }
}

Pracował dla mnie. W przeciwieństwie do odpowiedzi Willie Chenga, która nie działała dla mnie.
user890332,

5

Opcja UTF8

request.DefaultRequestHeaders.Authorization = 
new AuthenticationHeaderValue(
    "Basic", Convert.ToBase64String(
        System.Text.Encoding.UTF8.GetBytes(
           $"{yourusername}:{yourpwd}")));

3

Korzystanie z AuthenticationHeaderValueklasy System.Net.Httpmontażu

public AuthenticationHeaderValue(
    string scheme,
    string parameter
)

możemy ustawić lub zaktualizować istniejący Authorizationnagłówek dla naszego httpclientpodobnego:

httpclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", TokenResponse.AccessToken);

1
Witamy w SO, ale proszę dodać trochę kontekstu.
JP Hellemons,

Odpowiedź jest natychmiastowa, ale nie zaszkodzi mieć jednego linijkę wyjaśniającą, co powinien zrobić jego kod. Tylko mówię.
iiminov

2

BaseWebApi.cs

public abstract class BaseWebApi
{
    //Inject HttpClient from Ninject
    private readonly HttpClient _httpClient;
    public BaseWebApi(HttpClient httpclient)
    {
        _httpClient = httpClient;
    }

    public async Task<TOut> PostAsync<TOut>(string method, object param, Dictionary<string, string> headers, HttpMethod httpMethod)
    {
        //Set url

        HttpResponseMessage response;
        using (var request = new HttpRequestMessage(httpMethod, url))
        {
            AddBody(param, request);
            AddHeaders(request, headers);
            response = await _httpClient.SendAsync(request, cancellationToken);
        }

        if(response.IsSuccessStatusCode)
        {
             return await response.Content.ReadAsAsync<TOut>();
        }
        //Exception handling
    }

    private void AddHeaders(HttpRequestMessage request, Dictionary<string, string> headers)
    {
        request.Headers.Accept.Clear();
        request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        if (headers == null) return;

        foreach (var header in headers)
        {
            request.Headers.Add(header.Key, header.Value);
        }
    }

    private static void AddBody(object param, HttpRequestMessage request)
    {
        if (param != null)
        {
            var content = JsonConvert.SerializeObject(param);
            request.Content = new StringContent(content);
            request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
        }
    }

SubWebApi.cs

public sealed class SubWebApi : BaseWebApi
{
    public SubWebApi(HttpClient httpClient) : base(httpClient) {}

    public async Task<StuffResponse> GetStuffAsync(int cvr)
    {
        var method = "get/stuff";
        var request = new StuffRequest 
        {
            query = "GiveMeStuff"
        }
        return await PostAsync<StuffResponse>(method, request, GetHeaders(), HttpMethod.Post);
    }
    private Dictionary<string, string> GetHeaders()
    {
        var headers = new Dictionary<string, string>();
        var basicAuth = GetBasicAuth();
        headers.Add("Authorization", basicAuth);
        return headers;
    }

    private string GetBasicAuth()
    {
        var byteArray = Encoding.ASCII.GetBytes($"{SystemSettings.Username}:{SystemSettings.Password}");
        var authString = Convert.ToBase64String(byteArray);
        return $"Basic {authString}";
    }
}

1

W przypadku, gdy chcesz wysłać HttpClientżądanie z tokenem okaziciela, ten kod może być dobrym rozwiązaniem:

var requestMessage = new HttpRequestMessage
{
    Method = HttpMethod.Post,
    Content = new StringContent(".....", Encoding.UTF8, "application/json"),
    RequestUri = new Uri(".....")
};

requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", "Your token");

var response = await _httpClient.SendAsync(requestMessage);

0

W sieci .core możesz użyć

var client = new HttpClient();
client.SetBasicAuthentication(userName, password);

lub

var client = new HttpClient();
client.SetBearerToken(token);

1
Pierwszy przykład nie działa, ponieważ SetBasicAuthentication()domyślnie nie jest dostępny, więc musi to być metoda rozszerzenia. Gdzie to jest zdefiniowane?
ViRuSTriNiTy

0

Korzystanie z istniejącej biblioteki może być łatwiejsze.

Na przykład poniższe metody rozszerzenia są dodawane do Identity Server 4 https://www.nuget.org/packages/IdentityModel/

 public static void SetBasicAuthentication(this HttpClient client, string userName, string password);
    //
    // Summary:
    //     Sets a basic authentication header.
    //
    // Parameters:
    //   request:
    //     The HTTP request message.
    //
    //   userName:
    //     Name of the user.
    //
    //   password:
    //     The password.
    public static void SetBasicAuthentication(this HttpRequestMessage request, string userName, string password);
    //
    // Summary:
    //     Sets a basic authentication header for RFC6749 client authentication.
    //
    // Parameters:
    //   client:
    //     The client.
    //
    //   userName:
    //     Name of the user.
    //
    //   password:
    //     The password.
    public static void SetBasicAuthenticationOAuth(this HttpClient client, string userName, string password);
    //
    // Summary:
    //     Sets a basic authentication header for RFC6749 client authentication.
    //
    // Parameters:
    //   request:
    //     The HTTP request message.
    //
    //   userName:
    //     Name of the user.
    //
    //   password:
    //     The password.
    public static void SetBasicAuthenticationOAuth(this HttpRequestMessage request, string userName, string password);
    //
    // Summary:
    //     Sets an authorization header with a bearer token.
    //
    // Parameters:
    //   client:
    //     The client.
    //
    //   token:
    //     The token.
    public static void SetBearerToken(this HttpClient client, string token);
    //
    // Summary:
    //     Sets an authorization header with a bearer token.
    //
    // Parameters:
    //   request:
    //     The HTTP request message.
    //
    //   token:
    //     The token.
    public static void SetBearerToken(this HttpRequestMessage request, string token);
    //
    // Summary:
    //     Sets an authorization header with a given scheme and value.
    //
    // Parameters:
    //   client:
    //     The client.
    //
    //   scheme:
    //     The scheme.
    //
    //   token:
    //     The token.
    public static void SetToken(this HttpClient client, string scheme, string token);
    //
    // Summary:
    //     Sets an authorization header with a given scheme and value.
    //
    // Parameters:
    //   request:
    //     The HTTP request message.
    //
    //   scheme:
    //     The scheme.
    //
    //   token:
    //     The token.
    public static void SetToken(this HttpRequestMessage request, string scheme, string token);

0

Oauth Przebieg procesu jest złożony i zawsze jest miejsce na taki czy inny błąd. Moja sugestia będzie polegać na tym, aby zawsze używać kodu typu „kocioł” i zestawu bibliotek do uwierzytelniania OAuth, co ułatwi Ci życie.

Oto link do zestawu bibliotek. Biblioteki OAuth dla .Net


-1

to może działać, jeśli otrzymujesz json lub xml z usługi i myślę, że może to dać ci wyobrażenie o tym, jak działają nagłówki i typ T, jeśli użyjesz funkcji MakeXmlRequest (umieść wyniki w xmldocumnet) i MakeJsonRequest (umieść JSON w klasie, która ma taką samą strukturę jak odpowiedź JSON) w następny sposób

/*-------------------------example of use-------------*/
MakeXmlRequest<XmlDocument>("your_uri",result=>your_xmlDocument_variable =     result,error=>your_exception_Var = error);

MakeJsonRequest<classwhateveryouwant>("your_uri",result=>your_classwhateveryouwant_variable=result,error=>your_exception_Var=error)
/*-------------------------------------------------------------------------------*/


public class RestService
{
    public void MakeXmlRequest<T>(string uri, Action<XmlDocument> successAction, Action<Exception> errorAction)
    {
        XmlDocument XMLResponse = new XmlDocument();
        string wufooAPIKey = ""; /*or username as well*/
        string password = "";
        StringBuilder url = new StringBuilder();
        url.Append(uri);
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url.ToString());
        string authInfo = wufooAPIKey + ":" + password;
        authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
        request.Timeout = 30000;
        request.KeepAlive = false;
        request.Headers["Authorization"] = "Basic " + authInfo;
        string documento = "";
        MakeRequest(request,response=> documento = response,
                            (error) =>
                            {
                             if (errorAction != null)
                             {
                                errorAction(error);
                             }
                            }
                   );
        XMLResponse.LoadXml(documento);
        successAction(XMLResponse);
    }



    public void MakeJsonRequest<T>(string uri, Action<T> successAction, Action<Exception> errorAction)
    {
        string wufooAPIKey = "";
        string password = "";
        StringBuilder url = new StringBuilder();
        url.Append(uri);
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url.ToString());
        string authInfo = wufooAPIKey + ":" + password;
        authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
        request.Timeout = 30000;
        request.KeepAlive = false;
        request.Headers["Authorization"] = "Basic " + authInfo;
       // request.Accept = "application/json";
      //  request.Method = "GET";
        MakeRequest(
           request,
           (response) =>
           {
               if (successAction != null)
               {
                   T toReturn;
                   try
                   {
                       toReturn = Deserialize<T>(response);
                   }
                   catch (Exception ex)
                   {
                       errorAction(ex);
                       return;
                   }
                   successAction(toReturn);
               }
           },
           (error) =>
           {
               if (errorAction != null)
               {
                   errorAction(error);
               }
           }
        );
    }
    private void MakeRequest(HttpWebRequest request, Action<string> successAction, Action<Exception> errorAction)
    {
        try{
            using (var webResponse = (HttpWebResponse)request.GetResponse())
            {
                using (var reader = new StreamReader(webResponse.GetResponseStream()))
                {
                    var objText = reader.ReadToEnd();
                    successAction(objText);
                }
            }
        }catch(HttpException ex){
            errorAction(ex);
        }
    }
    private T Deserialize<T>(string responseBody)
    {
        try
        {
            var toReturns = JsonConvert.DeserializeObject<T>(responseBody);
             return toReturns;
        }
        catch (Exception ex)
        {
            string errores;
            errores = ex.Message;
        }
        var toReturn = JsonConvert.DeserializeObject<T>(responseBody);
        return toReturn;
    }
}
}

-1
static async Task<AccessToken> GetToken()
{
        string clientId = "XXX";
        string clientSecret = "YYY";
        string credentials = String.Format("{0}:{1}", clientId, clientSecret);

        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes(credentials)));
            List<KeyValuePair<string, string>> requestData = new List<KeyValuePair<string, string>>();
            requestData.Add(new KeyValuePair<string, string>("grant_type", "client_credentials"));
            FormUrlEncodedContent requestBody = new FormUrlEncodedContent(requestData);
            var request = await client.PostAsync("https://accounts.spotify.com/api/token", requestBody);
            var response = await request.Content.ReadAsStringAsync();
            return JsonConvert.DeserializeObject<AccessToken>(response);
        }
    }

Witamy w Stackoverflow. Oprócz udzielonej odpowiedzi rozważ krótkie wyjaśnienie, dlaczego i jak to rozwiązuje problem.
jtate

-2

Może to pomóc w ustawieniu nagłówka:

WebClient client = new WebClient();

string authInfo = this.credentials.UserName + ":" + this.credentials.Password;
authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
client.Headers["Authorization"] = "Basic " + authInfo;

9
On używa HttpClient, nie WebClient.
Jean Hominal
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.