Как отправить параметры в сервисы. AddHttpClient - это Startup.cs при создании IHttpClientFactory? - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь настроить 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 для назначения retryCount и sleepDuration в AddTransientHttpErrorPolicy, в данном случае 3 и 600 соответственно, потому что мне нужносоздайте клиентов с разными retryCounts и sleepDurations, и эти значения могут измениться.

Что-то вроде этого

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

Или другим способом, который вы предлагаете

Извините за мой плохой английскийЯ все еще учусь.

1 Ответ

3 голосов
/ 02 апреля 2019

Насколько я знаю, вы не можете. Это не совсем то, как 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 / конечной точки может потребоваться другая обработка, но в таком случае это аргумент для другого клиента.

...