Вот как я реализую свой подход - это то, как я настраиваю ConfigureryPolicies () Метод:
Код: Выделить всё
public static void ConfigureRetryPolicies(this IServiceCollection services, IConfiguration configuration)
{
var options = configuration.GetSection("VoucherifyVoucherProvider").Get();
services.AddHttpClient(client =>
{
client.BaseAddress = new Uri(options.BaseUrl);
client.Timeout = TimeSpan.FromSeconds(30);
client.DefaultRequestHeaders.Add("X-App-Token", options.AppToken);
client.DefaultRequestHeaders.Add("X-App-Id", options.AppId);
})
.AddPolicyHandler(GetComprehensiveRetryPolicy("Voucherify"))
.AddPolicyHandler(GetCircuitBreakerPolicy("Voucherify"));
// Register IVoucherProvider using typed client
services.AddScoped(sp =>
sp.GetRequiredService());
}
< /code>
реализация политики повторной попытки: < /p>
private static IAsyncPolicy GetComprehensiveRetryPolicy(string providerName)
{
return Policy
.Handle()
.Or()
.OrResult(r => !r.IsSuccessStatusCode)
.WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(2),
(outcome, timespan, retryCount, context) =>
{
Console.WriteLine($"[POLLY] Retry {retryCount} for {providerName}: {outcome.Exception?.Message ?? outcome.Result?.StatusCode.ToString()}");
});
}
< /code>
Класс поставщика ваучеров: < /p>
public class VoucherifyVoucherProvider : BaseVoucherProvider
{
private readonly HttpClient _httpClient;
private readonly VoucherifyProviderOptions _options;
public VoucherifyVoucherProvider(ILogger logger,
HttpClient httpClient,
IOptions options) : base(logger)
{
_httpClient = httpClient;
_options = options.Value;
}
public async Task RedeemVoucherAsync(...) {
var response = await _httpClient.PostAsJsonAsync("/v1/redeem", requestData);
response.EnsureSuccessStatusCode();
...
}
}
Код: Выделить всё
var field = typeof(HttpMessageInvoker).GetField("_handler", BindingFlags.NonPublic | BindingFlags.Instance);
var handler = field?.GetValue(_httpClient);
while (handler is DelegatingHandler delegatingHandler)
{
Console.WriteLine(handler.GetType().FullName);
handler = delegatingHandler.InnerHandler;
}
Почему не запускает политику Retry, когда запрашивается (E.G. Sue A Seight Of A Skey Skee Of A Skee To A Skey.>
Подробнее здесь: https://stackoverflow.com/questions/796 ... e-in-net-9