您可以将凭据添加到.Net中的现有HttpClient对象中吗

时间:2018-11-28 15:31:24

标签: c# .net httpclient

我的应用程序调用了许多不同的外部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,并依赖于事后获取凭据。

是否有办法在现有对象上设置凭据,或者在没有进行大量重构的情况下以其他方式设置凭据?

1 个答案:

答案 0 :(得分:2)

凭据所要做的只是将所需的身份验证标头添加到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"))));