【问题标题】:Can you add credentials to an existing HttpClient object in .Net [duplicate]您可以将凭据添加到 .Net 中的现有 HttpClient 对象吗?
【发布时间】:2018-11-28 15:31:23
【问题描述】:

我的应用程序调用了一堆不同的外部 API 类。为了促进这一点,我为每个要调用的外部 API 设置了一个类,所有这些都继承自一个基类,其开头如下:

public abstract class ApiBase : 
{
    protected static HttpClient client = new HttpClient();
    protected EntityFrameWorkCredentialObject credential;

    public bool AccountSupported(int accountId)
    {
        using (var context = DBProvider.GetTransientEntityContext())
        {
            credential = context.EntityFrameWorkCredentialObject
                            .Where(x => x.AccountId == accountId.FirstOrDefault();
        }

        return credential != null;
    }
}

这些对象是通过工厂类创建的,如果不先检查AccountSupported,就无法通过工厂类获取对象的实例。因此,任何继承此基类的类实例都将填充其credential

这些 API 中的大多数要么是公开的,要么接受密钥作为请求的一部分。但是,我们现在必须处理一个需要网络凭证的新 API。 HttpClient 的文档说这必须在创建对象时传递给它。

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

这显然会给我的对象的构建方式带来问题,因为它在实例化时会创建一个HttpClient,并且依赖于事后获取凭据。

有没有办法在现有对象上设置凭据,或者没有进行大量重构的其他方法?

【问题讨论】:

标签: c# .net httpclient


【解决方案1】:

凭证所做的只是将所需的身份验证标头添加到 httpclient 请求中。

您始终可以通过设置默认请求标头手动添加身份验证标头:

var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer","Token");
client.DefaultRequestHeaders.Authorization = 
    new AuthenticationHeaderValue("Basic",
    Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(
        string.Format("{0}:{1}", "yourusername", "yourpwd"))));

【讨论】:

  • 谢谢 - 问题原来是一个骗局,但这是正确的答案,值得和赞成
  • 感谢您一直在这里提供帮助 :)
猜你喜欢
  • 1970-01-01
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 2020-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多