Exemplo n.º 1
0
        public override void ConfigureServices(IServiceCollection services)
        {
            services.Configure <MediaBlobStorageOptions>(_configuration.GetSection("OrchardCore.Media.Azure"));

            // Only replace default implementation if options are valid.
            var connectionString = _configuration[$"OrchardCore.Media.Azure:{nameof(MediaBlobStorageOptions.ConnectionString)}"];
            var containerName    = _configuration[$"OrchardCore.Media.Azure:{nameof(MediaBlobStorageOptions.ContainerName)}"];

            if (MediaBlobStorageOptionsCheckFilter.CheckOptions(connectionString, containerName, _logger))
            {
                services.Replace(ServiceDescriptor.Singleton <IMediaFileStore>(serviceProvider =>
                {
                    var options             = serviceProvider.GetRequiredService <IOptions <MediaBlobStorageOptions> >().Value;
                    var clock               = serviceProvider.GetRequiredService <IClock>();
                    var contentTypeProvider = serviceProvider.GetRequiredService <IContentTypeProvider>();

                    var fileStore = new BlobFileStore(options, clock, contentTypeProvider);

                    var mediaBaseUri = fileStore.BaseUri;
                    if (!String.IsNullOrEmpty(options.PublicHostName))
                    {
                        mediaBaseUri = new UriBuilder(mediaBaseUri)
                        {
                            Host = options.PublicHostName
                        }
                    }
                    .Uri;

                    return(new MediaFileStore(fileStore, mediaBaseUri.ToString()));
                }));
        public async Task InitializeAsync()
        {
            IOptionsMonitor <BlobContainerConfiguration> optionsMonitor = Substitute.For <IOptionsMonitor <BlobContainerConfiguration> >();

            optionsMonitor.Get(BlobConstants.ContainerConfigurationName).Returns(_blobContainerConfiguration);
            optionsMonitor.Get(MetadataConstants.ContainerConfigurationName).Returns(_metadataContainerConfiguration);

            IBlobClientTestProvider testProvider = new BlobClientReadWriteTestProvider(RecyclableMemoryStreamManager);

            var blobClientInitializer = new BlobClientInitializer(testProvider, NullLogger <BlobClientInitializer> .Instance);

            _blobClient = blobClientInitializer.CreateBlobClient(_blobDataStoreConfiguration);

            var blobContainerInitializer     = new BlobContainerInitializer(_blobContainerConfiguration.ContainerName, NullLogger <BlobContainerInitializer> .Instance);
            var metadataContainerInitializer = new BlobContainerInitializer(_metadataContainerConfiguration.ContainerName, NullLogger <BlobContainerInitializer> .Instance);

            await blobClientInitializer.InitializeDataStoreAsync(
                _blobClient,
                _blobDataStoreConfiguration,
                new List <IBlobContainerInitializer> {
                blobContainerInitializer, metadataContainerInitializer
            });

            var jsonSerializer = new JsonSerializer();

            jsonSerializer.Converters.Add(new JsonDicomConverter());

            FileStore     = new BlobFileStore(_blobClient, optionsMonitor, RecyclableMemoryStreamManager, Substitute.For <BlobDataStoreConfiguration>());
            MetadataStore = new BlobMetadataStore(_blobClient, jsonSerializer, optionsMonitor, RecyclableMemoryStreamManager);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Host services to load site and shell settings from Azure Blob Storage.
        /// </summary>
        public static OrchardCoreBuilder AddAzureShellsConfiguration(this OrchardCoreBuilder builder)
        {
            var services = builder.ApplicationServices;

            services.TryAddSingleton <IContentTypeProvider, FileExtensionContentTypeProvider>();

            services.AddSingleton <IShellsFileStore>(sp =>
            {
                var configuration = sp.GetRequiredService <IConfiguration>();
                var blobOptions   = configuration.GetSectionCompat("OrchardCore:OrchardCore_Shells_Azure").Get <BlobShellStorageOptions>();
                if (blobOptions == null)
                {
                    throw new ArgumentNullException(nameof(BlobShellStorageOptions),
                                                    "The 'OrchardCore.Shells.Azure' configuration section must be defined");
                }

                var clock = sp.GetRequiredService <IClock>();
                var contentTypeProvider = sp.GetRequiredService <IContentTypeProvider>();

                var fileStore = new BlobFileStore(blobOptions, clock, contentTypeProvider);

                return(new BlobShellsFileStore(fileStore));
            });

            services.Replace(ServiceDescriptor.Singleton <IShellsSettingsSources>(sp =>
            {
                var shellsFileStore = sp.GetRequiredService <IShellsFileStore>();
                var configuration   = sp.GetRequiredService <IConfiguration>();
                var blobOptions     = configuration.GetSectionCompat("OrchardCore:OrchardCore_Shells_Azure").Get <BlobShellStorageOptions>();
                var shellOptions    = sp.GetRequiredService <IOptions <ShellOptions> >();

                return(new BlobShellsSettingsSources(shellsFileStore, blobOptions, shellOptions));
            }));

            services.Replace(ServiceDescriptor.Singleton <IShellConfigurationSources>(sp =>
            {
                var shellsFileStore = sp.GetRequiredService <IShellsFileStore>();
                var configuration   = sp.GetRequiredService <IConfiguration>();
                var blobOptions     = configuration.GetSectionCompat("OrchardCore:OrchardCore_Shells_Azure").Get <BlobShellStorageOptions>();
                var shellOptions    = sp.GetRequiredService <IOptions <ShellOptions> >();

                return(new BlobShellConfigurationSources(shellsFileStore, blobOptions, shellOptions));
            }));

            services.Replace(ServiceDescriptor.Singleton <IShellsConfigurationSources>(sp =>
            {
                var shellsFileStore = sp.GetRequiredService <IShellsFileStore>();
                var environment     = sp.GetRequiredService <IHostEnvironment>();
                var configuration   = sp.GetRequiredService <IConfiguration>();
                var blobOptions     = configuration.GetSectionCompat("OrchardCore:OrchardCore_Shells_Azure").Get <BlobShellStorageOptions>();
                var shellOptions    = sp.GetRequiredService <IOptions <ShellOptions> >();

                return(new BlobShellsConfigurationSources(shellsFileStore, environment, blobOptions, shellOptions));
            }));

            return(builder);
        }
        public async Task InitializeAsync()
        {
            IOptionsMonitor <BlobContainerConfiguration> optionsMonitor = Substitute.For <IOptionsMonitor <BlobContainerConfiguration> >();

            optionsMonitor.Get(Constants.BlobContainerConfigurationName).Returns(_blobContainerConfiguration);
            optionsMonitor.Get(Constants.MetadataContainerConfigurationName).Returns(_metadataContainerConfiguration);

            IBlobClientTestProvider testProvider = new BlobClientReadWriteTestProvider(RecyclableMemoryStreamManager, NullLogger <BlobClientReadWriteTestProvider> .Instance);

            _blobClient = BlobClientFactory.Create(_blobDataStoreConfiguration);

            var blobClientInitializer = new BlobInitializer(_blobClient, testProvider, NullLogger <BlobInitializer> .Instance);

            var blobContainerInitializer     = new BlobContainerInitializer(_blobContainerConfiguration.ContainerName, NullLogger <BlobContainerInitializer> .Instance);
            var metadataContainerInitializer = new BlobContainerInitializer(_metadataContainerConfiguration.ContainerName, NullLogger <BlobContainerInitializer> .Instance);

            await blobClientInitializer.InitializeDataStoreAsync(
                new List <IBlobContainerInitializer> {
                blobContainerInitializer, metadataContainerInitializer
            });

            FileStore     = new BlobFileStore(_blobClient, optionsMonitor, Options.Create(Substitute.For <BlobOperationOptions>()));
            MetadataStore = new BlobMetadataStore(_blobClient, RecyclableMemoryStreamManager, optionsMonitor, Options.Create(AppSerializerOptions.Json));
        }
Exemplo n.º 5
0
        public override void ConfigureServices(IServiceCollection services)
        {
            services.AddTransient <IConfigureOptions <MediaBlobStorageOptions>, MediaBlobStorageOptionsConfiguration>();

            // Only replace default implementation if options are valid.
            var connectionString = _configuration[$"OrchardCore_Media_Azure:{nameof(MediaBlobStorageOptions.ConnectionString)}"];
            var containerName    = _configuration[$"OrchardCore_Media_Azure:{nameof(MediaBlobStorageOptions.ContainerName)}"];

            if (CheckOptions(connectionString, containerName, _logger))
            {
                // Register a media cache file provider.
                services.AddSingleton <IMediaFileStoreCacheFileProvider>(serviceProvider =>
                {
                    var hostingEnvironment = serviceProvider.GetRequiredService <IWebHostEnvironment>();

                    if (String.IsNullOrWhiteSpace(hostingEnvironment.WebRootPath))
                    {
                        throw new Exception("The wwwroot folder for serving cache media files is missing.");
                    }

                    var mediaOptions  = serviceProvider.GetRequiredService <IOptions <MediaOptions> >().Value;
                    var shellOptions  = serviceProvider.GetRequiredService <IOptions <ShellOptions> >();
                    var shellSettings = serviceProvider.GetRequiredService <ShellSettings>();
                    var logger        = serviceProvider.GetRequiredService <ILogger <DefaultMediaFileStoreCacheFileProvider> >();

                    var mediaCachePath = GetMediaCachePath(hostingEnvironment, DefaultMediaFileStoreCacheFileProvider.AssetsCachePath, shellSettings);

                    if (!Directory.Exists(mediaCachePath))
                    {
                        Directory.CreateDirectory(mediaCachePath);
                    }

                    return(new DefaultMediaFileStoreCacheFileProvider(logger, mediaOptions.AssetsRequestPath, mediaCachePath));
                });

                // Replace the default media file provider with the media cache file provider.
                services.Replace(ServiceDescriptor.Singleton <IMediaFileProvider>(serviceProvider =>
                                                                                  serviceProvider.GetRequiredService <IMediaFileStoreCacheFileProvider>()));

                // Register the media cache file provider as a file store cache provider.
                services.AddSingleton <IMediaFileStoreCache>(serviceProvider =>
                                                             serviceProvider.GetRequiredService <IMediaFileStoreCacheFileProvider>());

                // Replace the default media file store with a blob file store.
                services.Replace(ServiceDescriptor.Singleton <IMediaFileStore>(serviceProvider =>
                {
                    var blobStorageOptions = serviceProvider.GetRequiredService <IOptions <MediaBlobStorageOptions> >().Value;
                    var shellOptions       = serviceProvider.GetRequiredService <IOptions <ShellOptions> >();
                    var shellSettings      = serviceProvider.GetRequiredService <ShellSettings>();
                    var mediaOptions       = serviceProvider.GetRequiredService <IOptions <MediaOptions> >().Value;
                    var clock = serviceProvider.GetRequiredService <IClock>();
                    var contentTypeProvider        = serviceProvider.GetRequiredService <IContentTypeProvider>();
                    var mediaEventHandlers         = serviceProvider.GetServices <IMediaEventHandler>();
                    var mediaCreatingEventHandlers = serviceProvider.GetServices <IMediaCreatingEventHandler>();
                    var logger = serviceProvider.GetRequiredService <ILogger <DefaultMediaFileStore> >();

                    var fileStore = new BlobFileStore(blobStorageOptions, clock, contentTypeProvider);

                    var mediaPath = GetMediaPath(shellOptions.Value, shellSettings, mediaOptions.AssetsPath);

                    var mediaUrlBase = "/" + fileStore.Combine(shellSettings.RequestUrlPrefix, mediaOptions.AssetsRequestPath);

                    var originalPathBase = serviceProvider.GetRequiredService <IHttpContextAccessor>()
                                           .HttpContext?.Features.Get <ShellContextFeature>()?.OriginalPathBase ?? null;

                    if (originalPathBase.HasValue)
                    {
                        mediaUrlBase = fileStore.Combine(originalPathBase.Value, mediaUrlBase);
                    }

                    return(new DefaultMediaFileStore(fileStore, mediaUrlBase, mediaOptions.CdnBaseUrl, mediaEventHandlers, mediaCreatingEventHandlers, logger));
                }));

                services.AddSingleton <IMediaEventHandler, DefaultMediaFileStoreCacheEventHandler>();

                services.AddScoped <IModularTenantEvents, CreateMediaBlobContainerEvent>();
            }
        }