【问题标题】:Default configuration for all HttpClient instances in .net Core.net Core 中所有 HttpClient 实例的默认配置
【发布时间】: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&lt;TClient, TImplementation&gt;( this IServiceCollection services, string baseUri ) { services.AddHttpClient&lt;TClient, TImplementation&gt;(client =&gt; { client.BaseAddress = new Uri(baseUri); }).UseErrorHandling().UseDefaultHeaders();} ?

标签: c# .net-core dotnet-httpclient asp.net-core-3.1


【解决方案1】:

这种情况的改进可能是这样的扩展方法:

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 中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多