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?

Stephen Hynes
źródło
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");
Stephen Hynes
źródło
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}")));
TheWhiteRabbit
źródło
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

Willie Cheng
źródło
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:

Philippe
źródło
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.

Florian Schaal
źródło
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.

Alan Ball
źródło
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>();
}
Amankhani MohammadJavad
źródło
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;
        }
LENG UNG
źródło
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", "[email protected]"},
           {"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

Dayan
źródło
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();
                    }
MohammadSoori
źródło
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);
emp
źródło
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);
  }
}
MPJ567
źródło
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}")));
romelmederos
źródło
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);
Połączenie
źródło
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}";
    }
}
Joel Wiklund
źródło
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);
Jourmand
źródło
0

W sieci .core możesz użyć

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

lub

var client = new HttpClient();
client.SetBearerToken(token);
Thom Kiesewetter
źródło
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);
Lee Smith
źródło
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

Khurram Jamil
źródło
-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;
    }
}
}
Jesus Cañedo
źródło
-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);
        }
    }
saurabh seth
źródło
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;
Codehelp
źródło
9
On używa HttpClient, nie WebClient.
Jean Hominal