public HttpClient CreateHttpClient() { System.Threading.Interlocked.Exchange(ref this._Timer, null)?.Dispose(); var handler = this._ReuseRecycleHandler; if (handler == null) { lock (this) { handler = Volatile.Read(ref this._ReuseRecycleHandler); if (handler == null) { handler = this.CreateReuseRecycleHandler(); this._ReuseRecycleHandler = handler; } } } // using ref count instead of weak references System.Threading.Interlocked.Increment(ref this._Usage); try { // var trigger = new DisposeRecycleHandler(handler, this); var httpClient = new HttpClient(trigger, true); if (!string.IsNullOrEmpty(this._Configuration.BaseAddress)) { httpClient.BaseAddress = new Uri(this._Configuration.BaseAddress); } foreach (var action in this._Configuration.HttpClientConfigurations) { if (action != null) { action(httpClient, this._Configuration); } } return(httpClient); } catch { System.Threading.Interlocked.Decrement(ref this._Usage); throw; } }
private ReuseRecycleHandler CreateReuseRecycleHandler() { // within lock var services = this._Services; var scope = (IServiceScope)null; if (!this._Configuration.SuppressHandlerScope) { scope = this._ScopeFactory?.CreateScope(); if (scope != null) { services = scope.ServiceProvider; } } var loggerName = this._Configuration.Name; // var outerLogger = this._LoggerFactory?.CreateLogger($"System.Net.Http.HttpClient.{loggerName}.LogicalHandler"); var innerLogger = this._LoggerFactory?.CreateLogger($"System.Net.Http.HttpClient.{loggerName}.ClientHandler"); var builder = services.GetRequiredService <IHttpMessageHandlerBuilder>(); builder.SetConfiguration(this._Configuration); builder.ApplyConfig(); var messageHandler = builder.Build(innerLogger); var handler = new ReuseRecycleHandler( this, messageHandler, scope, outerLogger ); System.Threading.Interlocked.Exchange(ref this._Timer, null)?.Dispose(); return(handler); }