22

Tôi đang gặp một số vấn đề khi sử dụng lớp HttpClient để truy cập vào API Ngon. Tôi có mã sau:Cách sử dụng thông tin đăng nhập trong HttpClient trong C#?

try 
{ 
    const string uriSources = "https://api.del.icio.us/v1/tags/bundles/all?private={myKey}"; 
    using (var handler = new HttpClientHandler { Credentials = new 
          NetworkCredential("MyUSER", "MyPASS") }) 
    { 
     using (var client = new HttpClient(handler)) 
     { 
      var result = await client.GetStringAsync(uriSources); 
     } 
    } 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message, "ERROR...", MessageBoxButton.OK); 
} 

Khi chạy mã ở trên, tôi nhận được thông tin sau: Mã trạng thái phản hồi không cho biết thành công: 401 (Không được phép).

Vì vậy, làm cách nào để có được tác phẩm này? Có thể không?

Cảm ơn trước

Trân trọng!

+0

401 Phương tiện trái phép Tên người dùng hoặc mật khẩu không chính xác ... – Raptor

+0

Tôi biết, tuy nhiên tôi đang sử dụng đúng tên ;-) – MikePR

+0

Khi tôi đặt url ở trên vào bất kỳ trình duyệt nào, hãy yêu cầu tôi cấp tín dụng (giống như tôi đang sử dụng trong mã) và nó hoạt động. Vì vậy, tôi đoán nó liên quan đến cách thức httpClient đang yêu cầu dữ liệu – MikePR

Trả lời

0

Mã bạn đang hiển thị hoạt động cho tôi dựa vào tài nguyên đã được xác thực. Tôi nghi ngờ Delicious đang làm điều gì đó kỳ lạ.

Xem xét bạn đang sử dụng Windows Phone, thật khó để gỡ lỗi với Fiddler, vì vậy những gì tôi đề xuất là nhận tài khoản Runscope. Cài đặt message handler này sẽ chuyển hướng yêu cầu của bạn thông qua trình gỡ lỗi RunScope. Một khi bạn làm điều này, tôi đề nghị bạn nhìn vào tiêu đề xác thực www và kiểm tra những gì đang quay trở lại.

Nếu vẫn thất bại, bạn luôn có thể đặt tiêu đề Xác thực trực tiếp bằng thông tin xác thực cơ bản. Bạn không cần sử dụng lớp Credentials.

29

Tôi cũng gặp vấn đề tương tự. Có vẻ như HttpClient chỉ bỏ qua các thông tin đăng nhập được đặt trong HttpClientHandler.

Sau đây sẽ làm việc tuy nhiên:

using System.Net.Http.Headers; // For AuthenticationHeaderValue 

const string uri = "https://example.com/path?params=1"; 
using (var client = new HttpClient()) { 
    var byteArray = Encoding.ASCII.GetBytes("MyUSER:MyPASS"); 
    var header = new AuthenticationHeaderValue(
       "Basic", Convert.ToBase64String(byteArray)); 
    client.DefaultRequestHeaders.Authorization = header; 

    var result = await client.GetStringAsync(uri); 
} 

Không cần xử lý.

Nguồn: http://www.snip2code.com/Snippet/13895/Simple-C---NET-4-5-HTTPClient-Request-Us

+3

Giải pháp này hoạt động tốt vì nó cho phép tiêu đề Cấp phép được đặt trên yêu cầu đầu tiên, do đó bỏ qua 401 Challenge/Response. Theo kinh nghiệm của tôi với HttpClient và HttpClientHandler, tuy nhiên, thiết lập trước xác thực không hoạt động ở chỗ tiêu đề Authorize được đặt trên mọi yêu cầu sau khi 401 Challenge/Response được hoàn tất. Bài viết này ở đây giải thích rõ: http://weblog.west-wind.com/posts/2010/Feb/18/NET-WebRequestPreAuthenticate-not-quite-what-it-sounds-like – Philippe

+2

@Adam Szabo [this] (https://gist.github.com/bryanbarnard/8102915) dường như là nguồn gốc – superjos

1

Đây là một bài cũ nhưng nghĩ thêm trả lời của tôi cho một người nào đó phải đối mặt với vấn đề tương tự và duyệt câu trả lời ...

tôi phải đối mặt với vấn đề tương tự. Trong trường hợp của tôi, hãy thiết lập thuộc tính Miền cho NetworkCredentials. Bạn có thể thử thiết lập Domain.

+0

Rất tốt nirav bhai – SPatel