我有一个场景,我在
HttpClient
中配置多个使用相同 Startup.cs
的 HttpClientHandlers
实例。这些 HttpClients
之间的唯一区别是 BaseAddress
属性和相应 HttpClient
实例的名称,因为我使用的是命名的 HttpClients
。
我想知道是否有可能创建一个默认的
HttpClient
,我将在其中添加所有这些处理程序,然后命名实例将继承它们,或者如果有其他方式,我如何集中添加这些处理程序而无需为每个 HttpClient
实例手动添加它们。
private void ConfigureHttpClients(IServiceCollection services)
{
services.AddHttpClient<IService1, Service>(client =>
{
client.BaseAddress = new Uri("http://api.test.com/");
})
.UseErrorHandling()
.UseDefaultHeaders();
services.AddHttpClient<IService2, Service2>(client =>
{
client.BaseAddress = new Uri("http://api.test-test.com/");
})
.UseErrorHandling()
.UseDefaultHeaders();
}
这种情况的改进可能是这样的扩展方法:
public static void AddMyHttpClient<TClient, TImplementation>( this IServiceCollection services,
string baseUri )
{
services.AddHttpClient<TClient, TImplementation>(client =>
{
client.BaseAddress = new Uri(baseUri);
})
.UseErrorHandling()
.UseDefaultHeaders();
}
然后可以用作
services.AddMyHttpClient<IService1, Service>("http://api.test.com/");
在 Startup.cs 中
更新
如果 Lambda 被误认为
Func<HttpClient, TClient>
,您将收到“并非所有代码路径都返回值”。
你可以像这样解决这个问题:
var configureAction = (HttpClient client) => { client.BaseAddress = new Uri(baseUri); };
services.AddHttpClient<TClient, TImpl>(configureAction);
看起来很奇怪,但我还没有找到更好的解决方案。