【发布时间】:2020-09-30 09:16:09
【问题描述】:
我有一个场景,我在Startup.cs 中配置多个HttpClient 实例,它们使用相同的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();
}
【问题讨论】:
-
请发布您的
startup.cs。你不是用IHttpClientFactory吗? -
@wegelagerer 你不是已经在这段代码中做你想做的事了吗?你使用的函数毕竟只是调用,你可以把
UseErrorHandling().UseDefaultHeaders()放在一个单独的方法中,然后在AddHttpClient之后调用。即使这只是一个调用,这意味着您可以创建自己的泛型方法,该方法接受类型作为泛型参数和基地址,并使用它来代替AddHttpClient -
真正的问题是,就像继承一样,你总是会发现规则的例外,并且必须使用不同的配置。在这种情况下,常见的配置方法就成了一个问题——您是否尝试使其可配置,可能会导致混乱并破坏其他客户端?或者复制那些特殊情况的配置调用?
-
所以是的,创建默认配置很容易。您甚至可以使用包含类型和 URL 的数组来一次配置所有处理程序,或者使用反射来查找所有相关服务并添加它们。但在某些时候,其中一些 HttpClient 将需要特殊处理——也许它们需要不同的重试策略?不同的标题?这并不意味着默认配置代码是错误的,只是要注意陷阱
-
类似...
public static void AddMyHttpClient<TClient, TImplementation>( this IServiceCollection services, string baseUri ) { services.AddHttpClient<TClient, TImplementation>(client => { client.BaseAddress = new Uri(baseUri); }).UseErrorHandling().UseDefaultHeaders();}?
标签: c# .net-core dotnet-httpclient asp.net-core-3.1