예제 #1
0
 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)
            );
 }
예제 #2
0
 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)))
            );
 }
예제 #3
0
        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");
        }