创建IHttpClientFactory时如何将参数发送到services.AddHttpClient是Startup.cs?

时间:2019-04-02 18:25:39

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

我正在尝试设置IHttpClientFactory,并且我想知道如何在创建IHttpClientFactory时向其发送参数,这些参数我需要分配给重试策略。

我正在使用.Net Core 2.2和Microsoft.Extensions.Http.Polly,我已经阅读了这篇帖子https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-2.2

我有这个是Startup.cs

services.AddHttpClient("MyClient", c =>
{
    c.BaseAddress = new Uri("http://interface.net");
    c.DefaultRequestHeaders.Add("Accept", "application/json");
})
.AddTransientHttpErrorPolicy(p => p.WaitAndRetryAsync(3, _ => TimeSpan.FromMilliseconds(600)));

我以这种方式使用

private readonly IHttpClientFactory _iHttpClientFactory;

public ValuesController(IHttpClientFactory iHttpClientFactory)
{
    _iHttpClientFactory = iHttpClientFactory;
}

public async Task<ActionResult<string>> Get()
{
    var client = _iHttpClientFactory.CreateClient("MyClient");
    var response = await client.GetAsync("/Service?Id=123");
    response.EnsureSuccessStatusCode();
    var result = await response.Content.ReadAsStringAsync();
    return result;
}

我想知道我执行CreateClient时是否有一种发送参数的方法,以便在AddTransientHttpErrorPolicy中分别分配给retryCount和sleepDuration,在这种情况下分别为3和600,因为我需要创建具有不同retryCounts的客户端和sleepDurations,这些值可以更改。

类似这样的东西

var retryCount = 5;
var sleepDuration = 400;
var client = _iHttpClientFactory.CreateClient("MyClient", retryCount, sleepDuration);

或者您建议的另一种方式

对不起,我的英语不好,我还在学习。

1 个答案:

答案 0 :(得分:2)

据我所知,您不能。 IHttpClientFactory的工作方式并非如此。这个想法是为特定场景提供可重用的客户端,而不是在不同场景之间共享的可无限配置的客户端,而Polly配置与此相伴。

换句话说,设计是您要为一个或多个客户端配置各种重试策略以及所需的重试策略,然后指定用于特定方案的客户端。

services.AddHttpClient("MyClient", c =>
{
    c.BaseAddress = new Uri("http://interface.net");
    c.DefaultRequestHeaders.Add("Accept", "application/json");
})
.AddTransientHttpErrorPolicy(p => p.WaitAndRetryAsync(3, _ => TimeSpan.FromMilliseconds(600)));

services.AddHttpClient("MyClient2", c =>
{
    c.BaseAddress = new Uri("http://interface.net");
    c.DefaultRequestHeaders.Add("Accept", "application/json");
})
.AddTransientHttpErrorPolicy(p => p.WaitAndRetryAsync(5, _ => TimeSpan.FromMilliseconds(400)));

然后,您可以使用CreateClient"MyClient"来调用"MyClient2"。为了避免重复使用主要客户端配置,您可以将主体排除在外:

Action<HttpClient> myClientConfig = c =>
{
    ...
}

然后:

services.AddHttpClient("MyClient", myClientConfig);

或者,您可以考虑创建自定义扩展程序:

public static IHttpClientBuilder AddMyClient(this IServiceCollection services, string clientName)
{
    return services.AddHttpClient(clientName, c =>
    {
        ...
    });
}

然后:

services.AddMyClient("MyClient")
    .AddTransientHttpErrorPolicy(...);

但是,一般而言,Polly策略应该几乎绑定到特定的用例。您将了解特定的API /端点需要什么,并直接围绕该API /端点构建策略。不同的API /端点可能需要不同的处理方式,但这是这种情况下不同客户端的一个论点。