httpclientfactory提供了以下扩展方法:
public static IHttpClientBuilder AddHttpClient<TClient>(this IServiceCollection services, string name)
我已经创建了一个类型化的httpclient,如下所示:
public class CustomClient {
public CustomClient(HttpClient client,
CustomAuthorizationInfoObject customAuthorizationInfoObject) {
/// use custom authorization info to customize http client
}
public async Task<CustomModel> DoSomeStuffWithClient() {
/// do the stuff
}
}
我可以在程序的ServiceCollection中注册此自定义客户端,如下所示:
services.AddTransient<CustomAuthorizationInfoObject>();
services.AddHttpClient<CustomClient>("DefaultClient");
然后,我可以注册这个customclient的第二个实例,其中包含一些稍作更改的信息:
services.AddHttpClient<CustomClient>("AlternativeAuthInfo", (client) => {
client.DefaultRequestHeaders.Authorization = ...;
});
在程序的其他地方,我现在想得到一个特定的名为
CustomClient
。这就是障碍。只要向服务提供商请求
CustomClient
,我就可以得到最后添加到服务的CustomClient
。例如,调用
IHttpClientFactory.CreateClient("AlternativeAuthInfo")
将返回一个HttpClient
,因此我无法访问customclient中的额外方法,而且似乎没有任何其他方法可以帮助我。因此,我如何获得一个命名的customclient?或者我是不是错用了通过原始扩展方法命名和引用键入的客户机的机会?
最佳答案
我看到有一个ITypedHttpClientFactory<>
接口可以将常规的HttpClient
包装在一个类型化的接口中。不是个人使用的,但那是丢失的部分吗?
例如
/// grab the named httpclient
var altHttpClient = httpClientFactory.CreateClient("AlternativeAuthInfo");
/// get the typed client factory from the service provider
var typedClientFactory = serviceProvider.GetService<ITypedHttpClientFactory<CustomClient>>();
/// create the typed client
var altCustomClient = typedClientFactory.CreateClient(altHttpClient);