Пример #1
0
        public async Task HttpConnectionChangesAfterTimeoutChange_UseChangeToken()
        {
            var serviceCollection = new ServiceCollection();

            var config = new HttpConnectionOptions()
            {
                Server = "www.google.com",
                Schema = "http",
                Port   = 80,
            };

            var timeout = new HttpTimeoutOptions()
            {
                TimeoutMS = 50000
            };

            serviceCollection.AddHttpClientOptions(options => { options.ServiceName = "service"; });

            serviceCollection
            .Configure <HttpClientOptions>("service", options =>
            {
                options.Connection.Server = config.Server;
                options.Connection.Schema = config.Schema;
                options.Connection.Port   = config.Port;
                options.Handler.HandlerLifeTimeMinutes = 0.05;
                options.Timeout.Timeout = timeout.Timeout;
            });

            serviceCollection
            .AddSingleton(new ChangeTokenSource <HttpClientOptions>("service"));

            serviceCollection
            .AddSingleton <IOptionsChangeTokenSource <HttpClientOptions> >(sp =>
                                                                           sp.GetRequiredService <ChangeTokenSource <HttpClientOptions> >());



            var serviceProvider = serviceCollection.BuildServiceProvider();
            var factory         = serviceProvider.GetRequiredService <IHttpClientFactory>();

            var client = factory.CreateClient("service");
            await client.GetAsync("/");

            timeout.TimeoutMS = 1;
            serviceProvider.GetRequiredService <ChangeTokenSource <HttpClientOptions> >().InvokeChange();

            await Task.Delay(TimeSpan.FromSeconds(10));

            var ex = Policy.Handle <AssertionException>().WaitAndRetry(new[]
            {
                TimeSpan.FromSeconds(10),
                TimeSpan.FromSeconds(10),
                TimeSpan.FromSeconds(20),
            }).Execute(() => Assert.ThrowsAsync <TimeoutException>(() => factory.CreateClient("service").GetAsync("/")));


            Assert.That(ex.Data.Keys, Has.One.Items.Contains("timeout"));
            Assert.That(ex.Data["timeout"], Is.EqualTo(TimeSpan.FromMilliseconds(1)));
        }
        public async Task HttpConnectionChangesAfterTimeoutChange_RemoveFromCache()
        {
            using var server = new WireServer(WireMockServer.Start());

            var timeout = new HttpTimeoutOptions()
            {
                TimeoutMS = 5000
            };

            var httpClientCollection = HttpOptionsBuilder.Configure(builder =>
            {
                builder.Configure(options =>
                {
                    options.AddClient("service", clientOptions =>
                    {
                        server.ConfigureWireMockServer(clientOptions);

                        clientOptions.Handler.HandlerLifeTimeMinutes = 0.05;
                        clientOptions.Timeout.Timeout = timeout.Timeout;
                    });
                }
                                  );
            }).Build();


            var client = httpClientCollection.CreateClient("service");
            await client.GetAsync("/delay/300ms");

            timeout.TimeoutMS = 1;
            httpClientCollection.ServiceProvider().GetRequiredService <IOptionsMonitorCache <HttpClientOptions> >().Clear();
            httpClientCollection.ServiceProvider().GetRequiredService <IOptionsMonitorCache <HttpClientCollectionOptions> >().TryRemove(HttpClientCollectionOptions.DefaultName);

            await Task.Delay(TimeSpan.FromSeconds(10));

            var ex = Policy.Handle <AssertionException>().WaitAndRetry(new[]
            {
                TimeSpan.FromSeconds(10),
                TimeSpan.FromSeconds(10),
                TimeSpan.FromSeconds(20),
            }).Execute(() =>
                       Assert.ThrowsAsync <TimeoutException>(() => httpClientCollection.CreateClient("service").GetAsync("/delay/300ms")));

            // factory.ServiceProvider().GetRequiredService<IOptionsMonitorCache<HttpClientOptions>>().Clear();
            // factory.ServiceProvider().GetRequiredService<IOptionsMonitorCache<HttpClientCollectionOptions>>().Clear();

            Assert.That(ex.Data.Keys, Has.One.Items.Contains("timeout"));
            Assert.That(ex.Data["timeout"], Is.EqualTo(TimeSpan.FromMilliseconds(1)));
        }