我的应用程序调用了许多不同的外部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
,并依赖于事后获取凭据。
是否有办法在现有对象上设置凭据,或者在没有进行大量重构的情况下以其他方式设置凭据?
答案 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"))));