Я реализовал Polly в своем решении, используя. net core 3.1 и Polly 7.2.0. Я создал расширения для IServiceCollection и в своем файле запуска я вызываю расширения для настройки и добавления клиента, а также для создания политики и ее регистрации.
В своем классе ExternalClient я использую IHttpClientFactory для использовать мой клиент и политику IAsyncPolicy, чтобы обернуть мои вызовы политикой, которую я создал и настроил при запуске.
Startup.cs
...
services.AddHttpClients(Configuration);
services.AddRetryPolicy(Configuration);
...
ServiceCollectionExtension.cs
...
var policy = Policy
.Handle<HttpRequestException>()
.WaitAndRetryAsync(3, i => TimeSpan.FromSeconds(retryCount), (exception, timeSpan, count,
context) =>
{
LogTo.Error($"Failed while posting to {myClient.Host}, retrying: " +
$"{count} of {retryCount} in " +
$"{timeSpan.TotalSeconds} seconds, with exception " +
$"{exception.Message}");
});
services.AddHttpClient("MyClient", c => { c.BaseAddress = new Uri(myClient.Host); })
.ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
{
Credentials = credentialsCache
});
...
ExternalClient
...
try
{
var response = await _policy
.ExecuteAsync(async () => (await _client.PostAsync(endpoint, requestBody)).EnsureSuccessStatusCode())
.ConfigureAwait(false);
return response.StatusCode == HttpStatusCode.OK;
}
catch (Exception ex)
{
LogTo.Error(ex, "Unable to contact Myclient");
}
...
Реализация политики работает нормально, следующий шаг - проверить, есть ли способ добавить URL-адрес аварийного переключения для моего клиента. Я проверил документацию для Полли, а также видел этот подход с WebClient, но это сработало бы, если бы политика и реализация находились в одном месте. Я полагаю, что было бы возможно сделать это, если бы у меня был вызов клиента http в методе, где я мог бы обернуть вызов этим с помощью ExecuteAsyn c, а затем предоставить другой клиент, но я искал более элегантное решение, что-то, что может быть там, но я не знаю.