【发布时间】: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,并且依赖于事后获取凭据。
有没有办法在现有对象上设置凭据,或者没有进行大量重构的其他方法?
【问题讨论】:
-
我会尝试这样的事情。 stackoverflow.com/questions/10077237/…
-
您可以尝试使用CredentialCache Class 预先管理处理程序。根据您决定是否启用
UseDefaultCredentials的请求端点 -
@RyanSchlueter Sweet,完成了这项工作,谢谢
标签: c# .net httpclient