Example #1
0
        public void RegisterAppServices(IServiceCollection services, IConfiguration config)
        {
            var policyConfigs = new HttpClientPolicyConfiguration();

            config.Bind("HttpClientPolicies", policyConfigs);

            var timeoutPolicy = Policy.TimeoutAsync <HttpResponseMessage>(TimeSpan.FromSeconds(policyConfigs.RetryTimeoutInSeconds));

            var retryPolicy = HttpPolicyExtensions
                              .HandleTransientHttpError()
                              .OrResult(r => r.StatusCode == HttpStatusCode.NotFound)
                              .WaitAndRetryAsync(policyConfigs.RetryCount, _ => TimeSpan.FromMilliseconds(policyConfigs.RetryDelayInMs));

            var circuitBreakerPolicy = HttpPolicyExtensions
                                       .HandleTransientHttpError()
                                       .CircuitBreakerAsync(policyConfigs.MaxAttemptBeforeBreak, TimeSpan.FromSeconds(policyConfigs.BreakDurationInSeconds));

            var noOpPolicy = Policy.NoOpAsync().AsAsyncPolicy <HttpResponseMessage>();

            //Register custom Bearer Token Handler. The DelegatingHandler has to be registered as a Transient Service
            services.AddTransient <ProtectedApiBearerTokenHandler>();

            //Register a Typed Instance of HttpClientFactory for a Protected Resource
            //More info see: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-3.0

            services.AddHttpClient <IQfPayApiConnect, QfPayApiConnect>(client =>
            {
                client.BaseAddress = new Uri(config["ApiResourceBaseUrls:QfPayApi"]);
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(HttpContentMediaTypes.JSON));
            })
            .SetHandlerLifetime(TimeSpan.FromMinutes(policyConfigs.HandlerTimeoutInMinutes))
            .AddPolicyHandler(request => request.Method == HttpMethod.Get ? retryPolicy : noOpPolicy)
            .AddPolicyHandler(timeoutPolicy)
            .AddPolicyHandler(circuitBreakerPolicy);

            services.AddHttpClient <IClientApiConnect, ClientApiConnect>(client =>
            {
                client.BaseAddress = new Uri(config["ApiResourceBaseUrls:ClientAPi"]);
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(HttpContentMediaTypes.JSON));
            })
            .SetHandlerLifetime(TimeSpan.FromMinutes(policyConfigs.HandlerTimeoutInMinutes))
            .AddPolicyHandler(request => request.Method == HttpMethod.Get ? retryPolicy : noOpPolicy)
            .AddPolicyHandler(timeoutPolicy)
            .AddPolicyHandler(circuitBreakerPolicy);


            //Register a Typed Instance of HttpClientFactory for AuthService
            services.AddHttpClient <IAuthServerConnect, AuthServerConnect>();

            // Register the DiscoveryCache in DI and will use the HttpClientFactory to create clients. Cached for 24hrs by default
            services.AddSingleton <IDiscoveryCache>(r =>
            {
                var factory = r.GetRequiredService <IHttpClientFactory>();
                return(new DiscoveryCache(config["ApiResourceBaseUrls:AuthServer"], () => factory.CreateClient()));
            });
        }
Example #2
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            var policyConfigs = new HttpClientPolicyConfiguration();

            Configuration.Bind("HttpClientPolicies", policyConfigs);

            services.AddHttpClient <IApiService, ApiService>(client =>
            {
                client.BaseAddress = new Uri(Configuration["ApiResourceBaseUrls:Api"]);
                client.DefaultRequestHeaders.Accept.Clear();
            });

            services.AddControllersWithViews();
        }
Example #3
0
        public void RegisterAppServices(IServiceCollection services, IConfiguration config)
        {
            var policyConfigs = new HttpClientPolicyConfiguration();

            config.Bind("HttpClientPolicies", policyConfigs);

            var timeoutPolicy = Policy.TimeoutAsync <HttpResponseMessage>(TimeSpan.FromSeconds(policyConfigs.RetryTimeoutInSeconds));

            //Configuracion de Polly para la resistencia y manejo de fallas transitorias
            //que permite a los desarrolladores expresar políticas como Retry,
            //Circuit Breaker, Timeout, Bulkhead Isolation y Fallback de manera fluida y segura.
            var retryPolicy = HttpPolicyExtensions
                              .HandleTransientHttpError()
                              .OrResult(r => r.StatusCode == HttpStatusCode.NotFound)
                              .WaitAndRetryAsync(policyConfigs.RetryCount, _ => TimeSpan.FromMilliseconds(policyConfigs.RetryDelayInMs));

            var circuitBreakerPolicy = HttpPolicyExtensions
                                       .HandleTransientHttpError()
                                       .CircuitBreakerAsync(policyConfigs.MaxAttemptBeforeBreak, TimeSpan.FromSeconds(policyConfigs.BreakDurationInSeconds));

            var noOpPolicy = Policy.NoOpAsync().AsAsyncPolicy <HttpResponseMessage>();


            //Registrar el Handler para Bearer Token.
            // services.AddTransient<ProtectedApiBearerTokenHandler>();

            //Info: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-3.0
            services.AddHttpClient <IApiClient, InideApiClient>(client =>
            {
                client.BaseAddress = new Uri(config["AppSettings:ApiBaseUrls:InideApi"]);
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(HttpContentMediaTypes.JSON));
            })
            .SetHandlerLifetime(TimeSpan.FromMinutes(policyConfigs.HandlerTimeoutInMinutes))
            .AddHttpMessageHandler <ProtectedApiBearerTokenHandler>()
            .AddPolicyHandler(request => request.Method == HttpMethod.Get ? retryPolicy : noOpPolicy)
            .AddPolicyHandler(timeoutPolicy)
            .AddPolicyHandler(circuitBreakerPolicy);

            //Seguridad en AuthService
            // services.AddHttpClient<IAuthServerConnect, AuthServerConnect>();

            // Cache
            //   services.AddSingleton<IDiscoveryCache>(r =>
            //  {
            //     var factory = r.GetRequiredService<IHttpClientFactory>();
            //    return new DiscoveryCache(config["ApiResourceBaseUrls:AuthServer"], () => factory.CreateClient());
            // });
        }