Đặt tiêu đề ủy quyền của httpClient


483

Tôi có một HTTPClient mà tôi đang sử dụng cho API REST. Tuy nhiên tôi gặp sự cố khi thiết lập tiêu đề Ủy quyền. Tôi cần đặt tiêu đề thành mã thông báo mà tôi nhận được khi thực hiện yêu cầu OAuth của mình. Tôi thấy một số mã cho .NET hàm ý những điều sau đây,

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

Tuy nhiên, lớp Thông tin không tồn tại trong WinRT. Bất cứ ai cũng có ý tưởng làm thế nào để thiết lập tiêu đề ủy quyền?


1
Lớp Thông tin thuộc về không gian tên nào?
kampj

@kampj Tôi không biết vì đó là không gian tên .NET không tồn tại trong WinRT
Stephen Hynes

1
Tại sao không yêu cầu.Headers.Add ("Ủy quyền", mã thông báo);
ahll

Câu trả lời:


816

Vì vậy, cách để làm điều đó là như sau,

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

15
làm thế nào để bạn nhận được "mã thông báo Oauth của bạn"?
Bí mật Squirrel

3
Những gì tôi đã sử dụng là: client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", "encrypted user/pwd");Lấy mã hóa người dùng / pwd từ mở rộng chrome nâng cao Nghỉ ngơi Client.
Red

6
@Red fyi, tham số thứ hai là người dùng được mã hóa base64: mật khẩu (không được mã hóa).
n00b

5
Ứng dụng của tôi đã rất vui khi sử dụng ứng dụng này trong nhiều năm, sau đó, tôi bắt đầu nhận được RuntimeBinderException. Tôi đã phải chuyển sang httpClient.DefaultRequestHeaders.Add ("Ủy quyền", "Người mang", "Mã thông báo Oauth của bạn"); để làm cho nó đi một lần nữa.
kraeg

8
@kraeg, mã bạn liệt kê không biên dịch, bạn có nghĩa là nối 2 chuỗi cuối như vậy: client.DefaultRequestHeaders.Add ("Authorization", "Bearer" + "Your Oauth token");
TroySteven

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

27
@MickyDuncan HttpClient có DefaultRequestHeaders.Authorization. Và câu trả lời này chỉ cứu vãn được ngày của tôi. Rất cám ơn WhiteRợi.
Joey Schluchter

3
Điều này không hoạt động, nếu bạn kiểm tra tiêu đề Auhtorization thì không chứa gì nhiều hơn một chuỗi Cơ bản.
Raffaeu

1
Bất cứ ai có thể giải thích lý do tại sao điều quan trọng là để chuyển đổi tên người dùng và mật khẩu để một chuỗi base64? Nó không cung cấp mã hóa thực sự, vậy tại sao điều đó lại quan trọng?
Jonathan Wood

3
@JonathanWood Bởi vì đó là cách nó được định nghĩa sẽ được sử dụng. Mời cơ bản không mã hóa, chỉ cần đủ mã hóa đến các vấn đề tránh với sự lựa chọn của ký tự mật khẩu trong một tiêu đề.
Richard

4
Có bất kỳ lý do cụ thể nào bạn đã sử dụng mã hóa ASCII ở đây không? Tôi cho rằng không có vấn đề với việc sử dụng mã hóa UTF8 vì chúng ta đang Base64 mã hóa nó anyways. Tôi đoán tôi đang tự hỏi nếu đặc tả xác thực Cơ bản nói rằng tên người dùng: mật khẩu chỉ nên ở dạng ASCII?
đè bẹp

82

Tôi tìm kiếm một cách tốt để giải quyết vấn đề này và tôi đang xem xét cùng một câu hỏi. Hy vọng rằng, câu trả lời này sẽ được giúp đỡ tất cả những người có cùng một vấn đề ấy thích tôi.

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.
    ....
}

tham khảo từ https://www.theidentityhub.com/hub/Documentation/CallTheIdentityHubApi


1
Tôi đang làm chính xác điều tương tự @willie và tôi vẫn nhận được một 401 từ API của tôi
SomethingOn

2
Xin chào @S SomethingOn Tôi nghĩ rằng bạn đã không nhận được mã thông báo chính xác, vì vậy bạn đã nhận được 401, tôi sẽ chia sẻ cách của mình trên "Hỏi câu hỏi" cá nhân của tôi, hy vọng nó có thể giúp bạn giải quyết vấn đề của mình.
Willie Cheng

14
Bạn không nên đặt một httpClient trong một usingkhối. (Vâng, tôi biết điều đó nghe có vẻ ngược, nhưng bạn sẽ bị rò rỉ kết nối nếu bạn sử dụng usingthay vì chỉ tái chế HttpClient.)
Jonathan Allen

42

Vì đó là một cách thực hành tốt để sử dụng lại cá thể HTTPClient , cho các vấn đề về hiệu năng và cạn kiệt cổng và vì không có câu trả lời nào đưa ra giải pháp này (và thậm chí dẫn bạn đến các thực tiễn xấu :(), tôi đặt ở đây một liên kết đến câu trả lời tôi đã thực hiện về một câu hỏi tương tự:

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

Một số nguồn về cách sử dụng HttpClient đúng cách:


5
Vấn đề cổng kiệt sức là không phải trò đùa. Nó gần như không bao giờ xảy ra trong QA, nhưng sẽ đánh vào bất kỳ dự án nào được sử dụng nhiều trong sản xuất.
Jonathan Allen

Xem bài đăng của tôi để biết ví dụ cụ thể stackoverflow.com/a/59052193/790635
emp

41

Tôi đồng ý với câu trả lời của TheWhiteRợi nhưng nếu bạn có nhiều cuộc gọi sử dụng HttpClient thì theo tôi, mã này có vẻ hơi lặp lại.

Tôi nghĩ có 2 cách để cải thiện câu trả lời một chút.

Tạo một lớp trợ giúp để tạo ứng dụng khách:

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;
    }
}

Sử dụng:

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

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

Tạo một phương thức mở rộng:

Không giành được giải thưởng sắc đẹp nhưng hoạt động tuyệt vời :)

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

Sử dụng:

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

Một lần nữa tôi nghĩ rằng 2 tùy chọn trên làm cho máy khách sử dụng câu lệnh ít lặp đi lặp lại. Hãy nhớ rằng cách tốt nhất để sử dụng lại HTTPClient nếu bạn thực hiện nhiều cuộc gọi http nhưng tôi nghĩ đó là một chút ngoài phạm vi cho câu hỏi này.


20
Tôi có thể thấy câu trả lời của bạn được nâng cao nhưng tôi không khuyến nghị cách tiếp cận này TL; DR hoàn toàn sai vì cạn kiệt ổ cắm, đây là liên kết
lacripta

2
@lacripta, Điều này đúng nhưng nếu bạn đọc 2 câu cuối tôi nói cách thực hành tốt nhất của nó là sử dụng lại HTTPClient vì lý do này chính xác nhưng tôi nghĩ nó nằm ngoài phạm vi của câu hỏi này.
Florian Schaal

1
Tôi có thể thấy quan điểm của bạn nhưng bạn đang đưa ra một gợi ý nói rằng mã này lặp đi lặp lại, điều này có thể dẫn đến việc sử dụng sai phương pháp nhà máy này, sẽ rất tốt khi chỉ ra những dòng đầu tiên rằng nó sẽ gây ra vấn đề sử dụng tài nguyên trong tương lai đặc biệt cho trường hợp này. và không chỉ là một cảnh báo mà hầu hết sẽ không đọc.
lacripta

1
Sử dụng HTTPClientFactory sẽ tốt hơn nhiều để tránh sự cố cạn kiệt ổ cắm.
RyanOC

21

Tôi đã thiết lập các thẻ vô danh

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

Nó được làm việc trong một thiết bị đầu cuối, nhưng không khác. Vấn đề là tôi đã có trường hợp thấp hơn btrên "bearer". Sau khi thay đổi, nó hoạt động cho cả api tôi đang đánh. Một điều dễ dàng như vậy để bỏ lỡ nếu bạn thậm chí không coi đó là một trong những đống rơm khô để tìm trong cho kim.

Hãy chắc chắn rằng có "Bearer"- với vốn.


18

Tôi gợi ý cho bạn:

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

Và sau đó bạn có thể sử dụng nó như thế:

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

Ví dụ, nếu mã thông báo của bạn hết thời gian 1 giờ thì bạn phải cập nhật HTTPClient với giải pháp này. Tôi sẽ đề nghị kiểm tra xem mã thông báo của bạn có còn hợp lệ hay không và làm mới nó và thêm nó vào httpRequestMessage
Johan Franzén

13

Để đặt xác thực cơ bản với C # HttpClient. Các mã sau đây đang làm việc cho tôi.

   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;
        }

Chính xác những gì tôi cần, cảm ơn.
rchrd

9

Đây là cách tôi đã thực hiện nó:

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());
      }
   }
}

Video you-tube này giúp tôi rất nhiều. Làm ơn hãy kiểm tra nó. https://www.youtube.com/watch?v=qCwnU06NV5Q


9

Sử dụng các thông số ủy quyền cơ bản và 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
Bạn không nên bao gồm mã để vô hiệu hóa việc kiểm tra chứng chỉ SSL trong một ví dụ như thế này. Mọi người có thể sao chép mã của bạn một cách mù quáng không nhận ra những gì nó làm. Tôi đã xóa những dòng đó cho bạn.
Giăng

9

Nếu bạn muốn sử dụng lại HttpClient, bạn không nên sử dụng DefaultRequestHeadersnhư chúng được sử dụng để gửi với mỗi yêu cầu.

Bạn có thể thử điều này:

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 năm sau nhưng thêm điều này trong trường hợp nó giúp được ai đó.

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

Đã làm cho tôi. Trái ngược với câu trả lời của Willie Cheng không phù hợp với tôi.
dùng89032

5

UTF8 Tùy chọn

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

3

Sử dụng AuthenticationHeaderValuelớp System.Net.Httplắp ráp

public AuthenticationHeaderValue(
    string scheme,
    string parameter
)

chúng tôi có thể đặt hoặc cập nhật Authorizationtiêu đề hiện có cho chúng tôi httpclientnhư vậy:

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

1
Chào mừng bạn đến với SO, nhưng vui lòng thêm một số bối cảnh.
JP Hellemons

Câu trả lời là tại chỗ nhưng sẽ không đau khi có một lớp lót giải thích mã của anh ta phải làm gì. Chỉ cần nói.
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

Trong trường hợp bạn muốn gửi HttpClientyêu cầu với Mã thông báo Bearer, mã này có thể là một giải pháp tốt:

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

Trong net .core bạn có thể sử dụng

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

hoặc là

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

1
Ví dụ đầu tiên không hoạt động như SetBasicAuthentication()không có sẵn theo mặc định vì vậy nó phải là một phương thức mở rộng. Nó được định nghĩa ở đâu?
ViRuSTriNiTy

0

Nó có thể dễ dàng hơn để sử dụng một thư viện hiện có.

Ví dụ: các phương thức mở rộng bên dưới được thêm vào Máy chủ Nhận dạng 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

Luồng quy trình Oauth rất phức tạp và luôn có chỗ cho lỗi này hay lỗi khác. Đề nghị của tôi sẽ là luôn luôn sử dụng mã soạn sẵn và một bộ thư viện cho luồng xác thực OAuth. Nó sẽ giúp cuộc sống của bạn dễ dàng hơn.

Đây là liên kết cho bộ thư viện. Thư viện OAuth cho .Net


-1

điều này có thể hoạt động, nếu bạn nhận được json hoặc xml từ dịch vụ và tôi nghĩ điều này có thể cho bạn ý tưởng về cách các tiêu đề và loại T hoạt động, nếu bạn sử dụng chức năng MakeXmlRequest (đặt kết quả vào xmldocumnet) và MakeJsonRequest (đặt json vào lớp bạn muốn có cùng cấu trúc với phản hồi của json) theo cách tiếp theo

/*-------------------------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);
        }
    }

Chào mừng đến với stackoverflow. Ngoài câu trả lời bạn đã cung cấp, vui lòng xem xét việc cung cấp giải thích ngắn gọn về lý do và cách khắc phục sự cố này.
jtate

-2

Điều này có thể giúp Đặt tiêu đề:

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
Ông đang sử dụng HttpClient, không phải WebClient.
Jean Hominal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.