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

23

当我使用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);
}

运行上述代码时,我得到了以下结果:响应状态码未成功指示:401(未经授权)。

那么,我该如何让这个工作?这可能吗?

提前感谢

问候!


401未经授权表示用户名或密码不正确... - Raptor
这可能看起来是个愚蠢的问题,但你实际上是在使用你的私钥而不是{myKey},你只是为了演示而放进去的,对吗? - Melvin DVaz
没错。我只是为了演示目的而放置了用户名和密码。在我的沙盒中,我使用的是好的用户名和密码;-) - MikePR
1
你尝试过使用HttpWebRequest吗?http://blog.karlbunyan.com/2007/02/11/asp-net-del-icio-us-api-integration-with-c/ - Erwin
嗨,Erwin。我一直没有时间测试你的建议,直到现在才有机会。它对我来说运行得很好。唯一的问题是HttpWebRequest在UI的同一个线程中执行。但是,我只需要检索一些数据。所以,我想这应该没问题。谢谢;-) - MikePR
显示剩余4条评论
3个回答

35
我曾经遇到过完全相同的问题。看起来 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);
}

不需处理程序。
来源:http://www.snip2code.com/Snippet/13895/Simple-C---NET-4-5-HTTPClient-Request-Us

3
这种方法很有效,因为它允许在第一次请求时设置Authorization头,从而避免了401 Challenge/Response。然而,在使用HttpClient和HttpClientHandler时,设置预认证确实能够工作,因为在完成401 Challenge/Response后,Authorize头会在每个请求中都被设置。这篇文章很好地解释了它:http://weblog.west-wind.com/posts/2010/Feb/18/NET-WebRequestPreAuthenticate-not-quite-what-it-sounds-like - Philippe
2
@Adam Szabo,这里似乎是原始来源。 - superjos

2

这是一篇旧帖子,但我认为可以为那些遇到类似问题并正在浏览答案的人添加回复...

我也遇到了类似的问题。在我的情况下,设置NetworkCredentials的Domain属性起作用了。你可以尝试设置Domain。


0

您展示的代码在经过身份验证的资源上对我有效。 我怀疑Delicious正在做一些奇怪的事情。

考虑到您使用的是Windows Phone,使用Fiddler进行调试很麻烦,因此我建议您获取Runscope帐户。 安装此message handler,它将通过RunScope调试器重定向您的请求。 这样做后,建议您查看www-authenticate标头并检查其返回内容。

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


我在这里发布了类似的问题 链接,如果您有时间给出建议、想法等,那就太好了。 - nam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接