如何在c#中使用HttpClient中的凭据?

Mik*_*ePR 22 c# windows-phone-7 dotnet-httpclient windows-phone-8 asynchttpclient

使用HttpClient类访问Delicious API时,我遇到了一些问题.我有以下代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

运行上面的代码时,我得到以下内容:响应状态代码不表示成功:401(未授权).

那么,我怎么能得到这个工作?可能吗?

提前致谢

问候!

Ada*_*abo 30

我自己也有同样的问题.它似乎HttpClient只是忽略了设置中的凭据HttpClientHandler.

但是,以下内容适用:

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);
}
Run Code Online (Sandbox Code Playgroud)

不需要处理程序.

来源:http://www.snip2code.com/Snippet/13895/Simple-C---NET-4-5-HTTPClient-Request-Us

  • 此解决方案运行良好,因为它允许在第一个请求上设置授权标头,从而绕过401质询/响应.但是,根据我使用HttpClient和HttpClientHandler的经验,设置pre-authenticate确实可以在401 Challenge/Response完成后在每个请求上设置Authorize标头.这篇文章解释得很好:http://weblog.west-wind.com/posts/2010/Feb/18/NET-WebRequestPreAuthenticate-not-quite-what-it-sounds-like (3认同)
  • @Adam Szabo [this](https://gist.github.com/bryanbarnard/8102915)似乎是原始来源 (2认同)

Dar*_*ler 0

您显示的代码对我来说适用于经过身份验证的资源。我怀疑Delicious正在做一些奇怪的事情。

考虑到你使用的是 Windows Phone,使用 Fiddler 进行调试是一件很痛苦的事情,所以我建议获得一个Runscope帐户。安装此消息处理程序,它将通过 RunScope 调试器重定向您的请求。执行此操作后,我建议您查看 www-authenticate 标头并检查其返回的内容。

如果所有其他方法都失败,您始终可以使用基本身份验证凭据直接设置身份验证标头。您不需要使用 Credentials 类。