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