示例#1
0
        /// <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);
            }
        }
示例#2
0
        /// <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);
        }
示例#3
0
        /// <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);