使用网络凭据的 HttpClient.GetAsync

109

我目前使用HttpWebRequest获取网站。我想使用等待模式,但HttpWebRequests不支持此模式。我找到了一个新的 Http worker 类 HttpClient。我正在使用HttpClient.GetAsync(...)查询我的网页。但是我缺少添加ClientCredentials的选项,类似于HttpWebRequest.Credentials。 有没有办法通过HttpClient提供身份验证信息?

2个回答

186

您可以将已包含凭据的 HttpClientHandler Class 实例与 HttpClient Constructor 一起传递:

using (var handler = new HttpClientHandler { Credentials = ... })
using (var client = new HttpClient(handler))
{
    var result = await client.GetAsync(...);
}

22
您还可以为 HttpClientHandler 设置 UseDefaultCredentials = true - Aleksei Poliakov
9
当需要使用基本身份验证时,这可能会导致次优行为。https://dev59.com/ml8e5IYBdhLWcg3wb56S - sharptooth
2
我发现你需要设置 handler.ClientCertificateOptions = ClientCertificateOption.Automatic 才能实际发送证书。 - Garr Godfrey
6
在服务器场景中,建议使用静态实例的HttpClient。 - James Westgate
3
在服务器场景下,我们应该怎么做?我们遇到了当没有静态实例时会遇到的问题,但我们需要传递凭据。 - Scott Chamberlain
显示剩余2条评论

6

不应该每次丢弃 HttpClient,而是在更长的时间内(应用程序生命周期)使用它(或一个小的客户端池)。您也不需要为它使用处理程序,而是可以更改默认标头。

创建客户端后,您可以设置其默认请求标头进行身份验证。以下是基本身份验证的示例:

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", "username:password".ToBase64());

ToBase64()是一个帮助函数,用于将字符串转换为base64编码。


1
使用HttpClientFactory的方式要好得多,它允许您轻松地在不每次创建新处理程序的情况下使用相同的httpClient,并使用不同的凭据。 - dove

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