/// <summary> /// Checks the <paramref name="resilience"/> to determine which resilience /// policies are enabled and adds to the <paramref name="httpClientBuilder" /> /// as appropriate. /// </summary> /// <param name="httpClientBuilder">The <see cref="IHttpClientBuilder"/> to add the policy to.</param> /// <param name="resilience">The <see cref="Resilience"/> instance with the settings for the service.</param> /// <exception cref="ArgumentNullException">Thrown when <paramref name="httpClientBuilder"/> or <paramref name="resilience"/> are null.</exception> public virtual void AddResiliencePolicy(IHttpClientBuilder httpClientBuilder, Resilience resilience) { httpClientBuilder.IsNull("httpClientBuilder"); resilience.IsNull("resilience"); // Check if retry is enabled for the service if (resilience.EnableRetry) { httpClientBuilder.AddPolicyHandlerFromRegistry(ResiliencePolicy.DefaultRetry); } // Check if circuit breaking is enabled for the service if (resilience.EnableCircuitBreaking) { httpClientBuilder.AddPolicyHandlerFromRegistry(ResiliencePolicy.DefaultCircuitbreaker); } }
/// <summary> /// Add an <see cref="HttpClient" /> with a custom policy. /// </summary> /// <typeparam name="TService">Service interface</typeparam> /// <typeparam name="TImplementation">Service concrete implementation</typeparam> /// <param name="name">Section key in AppSettings.json</param> /// <param name="policyNames">Array of policy names</param> public GanymedeClientActions AddGanymedeClientWithCustomPolicy <TService, TImplementation>(string name, IEnumerable <string> policyNames) where TService : class where TImplementation : class, TService { IHttpClientBuilder httpBuilder = ConfigureGanymedeHttpClientUsingAppSettings <TService, TImplementation>(name); foreach (string policyName in policyNames) { httpBuilder.AddPolicyHandlerFromRegistry(policyName); } return(this); }
/// <summary> /// Registers configured clients and policies with the DI container and HTTP client factory. /// </summary> /// <param name="services">The service collection</param> /// <param name="registry">The simulation registry containing all configuration state.</param> public static void AddSimulationEngineClients(this IServiceCollection services, IRegistry registry) { _ = services ?? throw new ArgumentNullException(nameof(services)); _ = registry ?? throw new ArgumentNullException(nameof(registry)); if (registry.PolicyRegistry is null || registry.Clients is null) { throw new InvalidOperationException( $"{nameof(registry.PolicyRegistry)} and {nameof(registry.Clients)} must be initialized."); } // Register initialised policy registry services.AddPolicyRegistry(registry.PolicyRegistry); // Enumerate all registered clients var clients = new List <KeyValuePair <string, ClientConfig> >(registry.Clients); foreach ((string name, var config) in clients) { IHttpClientBuilder builder = services.AddHttpClient(name, c => { c.BaseAddress = new Uri(config.BaseAddress); if (config.RequestHeaders != null) { foreach ((string key, string value) in config.RequestHeaders) { c.DefaultRequestHeaders.Add(key, value); } } }); // Add Polly policies to http client builder. // Note that any policies added through the http client factory initialization // must be of type IAsyncPolicy<HttpResponseMessage> or Polly will throw errors. foreach (string policy in config.Policies) { builder = builder.AddPolicyHandlerFromRegistry(policy); } } }
/// <summary> /// 通过内置Polly支持重试、超时、熔断等 /// </summary> public static IHttpClientBuilder WithDefaultPolicy(this IHttpClientBuilder builder) { builder.Services.AddDefaultPolicy(); return(builder.AddPolicyHandlerFromRegistry("default")); }
/// <summary> /// Add retry and circut braaker policy to http client /// </summary> /// <param name="builder"></param> /// <returns></returns> public static IHttpClientBuilder AddConfigurationPolicies(this IHttpClientBuilder builder) => builder .AddPolicyHandlerFromRegistry(PollyPolicesExtensions.PolicyName.HttpRetry) .AddPolicyHandlerFromRegistry(PollyPolicesExtensions.PolicyName.HttpCircuitBreaker);