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())); }); }
// 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(); }
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()); // }); }