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

M. *_*Mis 0 c# dotnet-httpclient polly asp.net-core

我正在尝试设置一个 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)));
Run Code Online (Sandbox Code Playgroud)

我是这样用的

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

Run Code Online (Sandbox Code Playgroud)

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

像这样的东西

var retryCount = 5;
var sleepDuration = 400;
var client = _iHttpClientFactory.CreateClient("MyClient", retryCount, sleepDuration);
Run Code Online (Sandbox Code Playgroud)

或者你建议的另一种方式

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

Chr*_*att 6

据我所知,你不能。这并不是真正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)));
Run Code Online (Sandbox Code Playgroud)

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

Action<HttpClient> myClientConfig = c =>
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后:

services.AddHttpClient("MyClient", myClientConfig);
Run Code Online (Sandbox Code Playgroud)

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

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

进而:

services.AddMyClient("MyClient")
    .AddTransientHttpErrorPolicy(...);
Run Code Online (Sandbox Code Playgroud)

不过,总的来说,Polly 策略应该几乎绑定到特定用例。您将知道特定 API/端点需要什么,并且您将直接围绕它构建策略。不同的 API/端点可能需要不同的处理,但在这种情况下,这是不同客户端的论据。