HttpClient.GetAsync与网络凭据

Jan*_* K. 90 c# async-await .net-4.5

我目前正在使用HttpWebRequest网站.我想使用await模式,这是没有给出的HttpWebRequests.我找到了这个类HttpClient,它似乎是新的Http工人类.我正在HttpClient.GetAsync(...)用来查询我的网页.但我错过了添加ClientCredentials喜欢的选项HttpWebRequest.Credentials.有没有办法提供HttpClient身份验证信息?

dtb*_*dtb 158

您可以将带有凭据的HttpClientHandler类的实例传递给HttpClient构造函数:

using (var handler = new HttpClientHandler { Credentials = ... })
using (var client = new HttpClient(handler))
{
    var result = await client.GetAsync(...);
}
Run Code Online (Sandbox Code Playgroud)

  • 您还可以为`HttpClientHandler`设置`UseDefaultCredentials = true` (18认同)
  • 当需要*Basic*身份验证时,这可能会导致次优行为http://stackoverflow.com/q/25761214/57428 (9认同)
  • 建议使用HttpClient的静态实例,尤其是在服务器场景中 (4认同)
  • 那么在服务器场景中我们该怎么做呢?当您没有静态实例但我们需要传递凭据时,我们会遇到您遇到的问题. (3认同)
  • 我发现你会想要设置handler.ClientCertificateOptions = ClientCertificateOption.Automatic以便实际发送信用额度. (2认同)
  • 在 ASP.NET Core 中使用 IHttpClientFactory 提供的命名 HttpClient 时如何做到这一点? (2认同)

小智 7

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

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

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", "username:password".ToBase64());
Run Code Online (Sandbox Code Playgroud)

ToBase64() 表示将字符串转换为 Base64 编码的辅助函数。