![](/img/trans.png)
[英]ASP.NET Core 2.1: Add client certificate to registered typed HTTP clients
[英]Using factory method to create typed HTTP client, ASP.NET Core 2.1
我正在遵循有关在我的应用程序中注册HTTP客户端的指南/文档。 我需要打电话给几个服务,所以我决定使用“类型客户”。
为了调用另一个服务,我需要使用OAuth-因为这是服务到服务的调用,所以当我获取访问令牌时,我会对其进行缓存+我已经设置了令牌的定期刷新。 这意味着还有另一个组件IAccessTokenCache
,它为我提供了服务的访问令牌。
我正在努力弄清的是如何注册和配置键入的HTTP客户端, IAccessTokenCache
它也依赖于IAccessTokenCache
。
我正在使用ASP.NET Core 2.1(重要细节,请继续阅读)。
HTTP客户端包装看起来像这样(来自: ASP.NET Core 2.1(第2部分)中的HttpClientFactory ):
public class ServiceFooClient
{
public ServiceFooClient(HttpClient client)
{
Client = client;
}
public HttpClient Client { get; }
}
这就是我注册和配置客户端的方式:
services
.AddHttpClient<ServiceFooClient>(
c =>
{
c.BaseAddress = new Uri("https://www.foo.svc");
// TODO: grab particular access token from cache
c.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "...");
})
.AddHttpMessageHandler<ResponseMonitorHandler>()
.ConfigureHttpMessageHandlerBuilder(
b =>
{
var handler =
b.AdditionalHandlers.OfType<ResponseMonitorHandler>().FirstOrDefault();
if (handler != null)
{
handler.ServiceName = "Foo Service";
}
});
...我已经在配置HTTP客户端,甚至添加了自定义HTTP处理程序。 您可以看到要访问IAccessTokenCache
确切点,但是我不能。
ServiceFooClient
包装器中配置基础HttpClient
,例如: // ctor
public ServiceFooClient(HttpClient httpClient, IAccessTokenCache tokenCache)
{
Client = httpClient;
Client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenCache.GetToken("Foo"));
}
这可以很好地工作,除非我不进行配置解耦-突然,专用的HTTP客户端在Startup
中配置了一部分(基本URI,其他HTTP处理程序),在包装类中又配置了一部分(设置授权标头)。
AddHttpClient
扩展方法(及其他) 我真的不需要调用HttpClientFactoryServiceCollectionExtensions.AddHttpClient<T>(...)
-我可以自己做所有这些事情。 但是作为懒惰的开发人员……我什至不想结束这句话。 内部有很多注册,所以对我来说这是很大的不。
与上一点有关-在2.1中,不会接受将接受服务提供者回调的AddHttpClient
(2.2: AddHttpClient<TClient>(this IServiceCollection services, Action<IServiceProvider, HttpClient> configureClient)
)的重载。 升级到2.2可能是最好的解决方案,但是我必须确保没有其他问题(并且我已经知道BC中断了/在HTTP上下文中获取/设置请求跟踪ID)。 这可能有潜在的风险,所以我首先尝试解决2.1范围内的问题。
将2.1的分支与2.2进行比较: HttpClientFactoryServiceCollectionExtensions
与现在注册ResponseMonitorHandler
方式相同,我可以注册可访问IAccessTokenCache
并设置请求授权标头的HTTP处理程序。
但是同样,与第一种情况一样,这会取消HTTP客户端的配置。 同样,如果我有几个不同的访问令牌,我要么需要实现几个HTTP处理程序,要么做一些逻辑,根据请求属性来决定要使用缓存中的哪个令牌。
最后,问题 :还有其他我没有考虑的方法吗? 在ASP.NET 2.1中是否有简单的解决方案? (...当然只是2.2版中的复制粘贴方法)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.