public ImageflowMiddleware( RequestDelegate next, IWebHostEnvironment env, IEnumerable <ILogger <ImageflowMiddleware> > logger, IEnumerable <IClassicDiskCache> diskCaches, IEnumerable <IStreamCache> streamCaches, IEnumerable <IBlobProvider> blobProviders, ImageflowMiddlewareOptions options) { this.next = next; options.Licensing ??= new Licensing(LicenseManagerSingleton.GetOrCreateSingleton( "imageflow_", new[] { env.ContentRootPath, Path.GetTempPath() })); this.options = options; this.env = env; this.logger = logger.FirstOrDefault(); diskCache = diskCaches.FirstOrDefault(); var streamCacheArray = streamCaches.ToArray(); if (streamCacheArray.Count() > 1) { throw new InvalidOperationException("Only 1 IStreamCache instance can be registered at a time"); } streamCache = streamCacheArray.FirstOrDefault(); var providers = blobProviders.ToList(); var mappedPaths = options.MappedPaths.ToList(); if (options.MapWebRoot) { if (this.env?.WebRootPath == null) { throw new InvalidOperationException("Cannot call MapWebRoot if env.WebRootPath is null"); } mappedPaths.Add(new PathMapping("/", this.env.WebRootPath)); } //Determine the active cache backend var streamCacheEnabled = streamCache != null && options.AllowCaching; var diskCacheEnabled = this.diskCache != null && options.AllowDiskCaching; if (streamCacheEnabled) { options.ActiveCacheBackend = CacheBackend.StreamCache; } else if (diskCacheEnabled) { options.ActiveCacheBackend = CacheBackend.ClassicDiskCache; } else { options.ActiveCacheBackend = CacheBackend.NoCache; } options.Licensing.Initialize(this.options); blobProvider = new BlobProvider(providers, mappedPaths); diagnosticsPage = new DiagnosticsPage(options, env, this.logger, streamCache, this.diskCache, providers); licensePage = new LicensePage(options); globalInfoProvider = new GlobalInfoProvider(options, env, this.logger, streamCache, this.diskCache, providers); options.Licensing.FireHeartbeat(); GlobalPerf.Singleton.SetInfoProviders(new List <IInfoProvider>() { globalInfoProvider }); }