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