【问题标题】:HttpClient.GetAsync with network credentials带有网络凭据的 HttpClient.GetAsync
【发布时间】:2012-05-04 18:48:51
【问题描述】:

我目前正在使用HttpWebRequest 获取网站。我想使用HttpWebRequests 没有给出的等待模式。找到了HttpClient这个类,好像是新的Http worker类。我正在使用HttpClient.GetAsync(...) 来查询我的网页。但我错过了添加ClientCredentials 的选项,例如HttpWebRequest.Credentials。有没有办法给HttpClient认证信息?

【问题讨论】:

    标签: c# async-await .net-4.5


    【解决方案1】:

    您可以将带有凭据的HttpClientHandler Class 实例传递给HttpClient Constructor

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

    【讨论】:

    • 也可以设置UseDefaultCredentials = trueHttpClientHandler
    • 当需要基本身份验证时,这可能会导致次优行为stackoverflow.com/q/25761214/57428
    • 我发现您需要设置 handler.ClientCertificateOptions = ClientCertificateOption.Automatic 以便实际发送信用。
    • 建议使用 HttpClient 的静态实例,尤其是在服务器场景中
    • 那么在服务器场景下我们应该怎么做呢?当您没有静态实例但我们需要传递凭据时,我们正在解决您遇到的问题。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 这种方式在使用 HttpClientFactory 时效果更好,允许您轻松使用具有不同凭据的相同 httpClient,而无需每次都创建新的处理程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多