.net Core 中所有 HttpClient 实例的默认配置

问题描述 投票:0回答:1

我有一个场景,我在

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();
}
c# .net-core dotnet-httpclient asp.net-core-3.1
1个回答
3
投票

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

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);

看起来很奇怪,但我还没有找到更好的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.