internal static IAsyncPolicy <HttpResponseMessage> GetCircuitBreakerPolicy(CBR cbr) { return(HttpPolicyExtensions .HandleTransientHttpError() .CircuitBreakerAsync(cbr.ExceptionsAllowedBeforeBreaking, TimeSpan.FromMinutes(cbr.DurationOfBreak)) //.CircuitBreakerAsync<HttpResponseMessage>(cbr.ExceptionsAllowedBeforeBreaking, // TimeSpan.FromMinutes(cbr.DurationOfBreak), // onBreak: onBreak, onReset: onReset) ); }
internal static IAsyncPolicy <HttpResponseMessage> GetRetryPolicy(CBR cbr) { return(HttpPolicyExtensions .HandleTransientHttpError() //.Or<Polly.Timeout.TimeoutRejectedException>() // ** ADDED ** //.Or<System.Net.Sockets.SocketException>() // ** ADDED ** .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound) //.OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.BadRequest) //.OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.Forbidden) //.OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.Unauthorized) .WaitAndRetryAsync(cbr.RetryCount, retryAttempt => TimeSpan.FromSeconds(Math.Pow(cbr.SleepDuration, retryAttempt))) //.WrapAsync(Policy.TimeoutAsync(TimeSpan.FromSeconds(20))) ); }
static async Task MainAsync(string[] args) { var cbrConfig = new CBR { HandlerLifetime = 5, ExceptionsAllowedBeforeBreaking = 2, DurationOfBreak = 1, RetryCount = 3, SleepDuration = 2, UserAgent = "YUP" }; //CreandoServiceProvider [Test] IServiceCollection service = new ServiceCollection(); service .AddHttpClient <IDemoWebApiClient, DemoWebApiClient>() .ConfigureHttpClient(c => { c.BaseAddress = new Uri("https://localhost:5001/"); //c.DefaultRequestHeaders.Add("Accept", "application/json"); c.DefaultRequestHeaders.Accept.Clear(); c.MaxResponseContentBufferSize = int.MaxValue; //c.Timeout = TimeSpan.FromSeconds(1000); }) .SetHandlerLifetime(TimeSpan.FromMinutes(cbrConfig.HandlerLifetime)) .AddPolicyHandler(Policies.GetRetryPolicy(cbrConfig)) //.AddPolicyHandler(request => request.Method == HttpMethod.Get ? Policies.GetRetryPolicy(cbrConfig) : Policies.GetNoOpPolicy()) .AddPolicyHandler(Policies.GetCircuitBreakerPolicy(cbrConfig)) //Abreviado //.AddTransientHttpErrorPolicy(policyBuilder => policyBuilder.WaitAndRetryAsync(cbrConfig.RetryCount, retryAttempt => TimeSpan.FromSeconds(Math.Pow(cbrConfig.SleepDuration, retryAttempt)))) //.AddTransientHttpErrorPolicy(policyBuilder => policyBuilder.CircuitBreakerAsync(cbrConfig.ExceptionsAllowedBeforeBreaking, TimeSpan.FromSeconds(cbrConfig.DurationOfBreak))) ; var serviceProvider = service.BuildServiceProvider(); var webApiClient = serviceProvider.GetService <IDemoWebApiClient>(); int counts = 1; Console.WriteLine("Comenzando Pruebas"); while (counts < 5) { Console.WriteLine($"Prueba Numero: {counts}"); try { var resultado = await webApiClient.GetConfiguracionAsync(); Console.WriteLine(JsonConvert.SerializeObject(resultado)); } catch (Exception ex) { Console.WriteLine("Tipo de Exception: Type is {0}", ex.GetType()); if (ex.InnerException != null) { Console.WriteLine("Tipo de InnerException: Type is {0}", ex.InnerException.GetType()); } } counts++; } Console.WriteLine("Finish"); }