コード例 #1
0
        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;
            }
        }
コード例 #2
0
        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);
        }