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

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

我正在尝试设置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);

或者你建议的其他方式

抱歉我的英语不好,我还在学习。

c# asp.net-core dotnet-httpclient polly
1个回答
3
投票

据我所知,你不能。这并不是真正的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 /端点可能需要不同的处理,但在这种情况下,这是不同客户端的参数。

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