From 696675feffb8008978f12df5d22653d2ab4c236b Mon Sep 17 00:00:00 2001 From: "nuck.tang" Date: Wed, 8 Jul 2020 16:45:38 +0800 Subject: [PATCH 01/20] Blob storage Minio support --- framework/Volo.Abp.sln | 30 +++- .../FodyWeavers.xml | 3 + .../FodyWeavers.xsd | 30 ++++ .../Volo.Abp.BlobStoring.Minio.csproj | 21 +++ .../Minio/AbpBlobStoringMinioModule.cs | 10 ++ .../Minio/DefaultMinioBlobNameCalculator.cs | 22 +++ .../Minio/IMinioBlobNameCalculator.cs | 7 + ...nioBlobContainerConfigurationExtensions.cs | 24 +++ .../BlobStoring/Minio/MinioBlobProvider.cs | 159 ++++++++++++++++++ .../Minio/MinioBlobProviderConfiguration.cs | 65 +++++++ .../MinioBlobProviderConfigurationNames.cs | 12 ++ .../Volo.Abp.BlobStoring.Minio.Tests.csproj | 17 ++ .../Minio/AbpBlobStoringMinioTestBase.cs | 20 +++ .../Minio/AbpBlobStoringMinioTestModule.cs | 80 +++++++++ .../Minio/MinioBlobContainer_Tests.cs | 16 ++ .../Minio/MinioBlobNameCalculator_Tests.cs | 57 +++++++ 16 files changed, 565 insertions(+), 8 deletions(-) create mode 100644 framework/src/Volo.Abp.BlobStoring.Minio/FodyWeavers.xml create mode 100644 framework/src/Volo.Abp.BlobStoring.Minio/FodyWeavers.xsd create mode 100644 framework/src/Volo.Abp.BlobStoring.Minio/Volo.Abp.BlobStoring.Minio.csproj create mode 100644 framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/AbpBlobStoringMinioModule.cs create mode 100644 framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/DefaultMinioBlobNameCalculator.cs create mode 100644 framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/IMinioBlobNameCalculator.cs create mode 100644 framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobContainerConfigurationExtensions.cs create mode 100644 framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs create mode 100644 framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProviderConfiguration.cs create mode 100644 framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProviderConfigurationNames.cs create mode 100644 framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo.Abp.BlobStoring.Minio.Tests.csproj create mode 100644 framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/AbpBlobStoringMinioTestBase.cs create mode 100644 framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/AbpBlobStoringMinioTestModule.cs create mode 100644 framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobContainer_Tests.cs create mode 100644 framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobNameCalculator_Tests.cs diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index e02d40b1e0..77bb8a2531 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -289,21 +289,25 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.AspNetCore.SignalR EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.AspNetCore.SignalR.Tests", "test\Volo.Abp.AspNetCore.SignalR.Tests\Volo.Abp.AspNetCore.SignalR.Tests.csproj", "{8B758716-DCC9-4223-8421-5588D1597487}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests", "test\Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests\Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests.csproj", "{79323211-E658-493E-9863-035AA4C3F913}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests", "test\Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests\Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Tests.csproj", "{79323211-E658-493E-9863-035AA4C3F913}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring", "src\Volo.Abp.BlobStoring\Volo.Abp.BlobStoring.csproj", "{A0CFBDD6-A3CB-438C-83F1-5025F12E2D42}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.BlobStoring", "src\Volo.Abp.BlobStoring\Volo.Abp.BlobStoring.csproj", "{A0CFBDD6-A3CB-438C-83F1-5025F12E2D42}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring.Tests", "test\Volo.Abp.BlobStoring.Tests\Volo.Abp.BlobStoring.Tests.csproj", "{D53A17BB-4E23-451D-AD9B-E1F6AC3F7958}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.BlobStoring.Tests", "test\Volo.Abp.BlobStoring.Tests\Volo.Abp.BlobStoring.Tests.csproj", "{D53A17BB-4E23-451D-AD9B-E1F6AC3F7958}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring.FileSystem", "src\Volo.Abp.BlobStoring.FileSystem\Volo.Abp.BlobStoring.FileSystem.csproj", "{02B1FBE2-850E-4612-ABC6-DD62BCF2DD6B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.BlobStoring.FileSystem", "src\Volo.Abp.BlobStoring.FileSystem\Volo.Abp.BlobStoring.FileSystem.csproj", "{02B1FBE2-850E-4612-ABC6-DD62BCF2DD6B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring.FileSystem.Tests", "test\Volo.Abp.BlobStoring.FileSystem.Tests\Volo.Abp.BlobStoring.FileSystem.Tests.csproj", "{68443D4A-1608-4039-B995-7AF4CF82E9F8}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.BlobStoring.FileSystem.Tests", "test\Volo.Abp.BlobStoring.FileSystem.Tests\Volo.Abp.BlobStoring.FileSystem.Tests.csproj", "{68443D4A-1608-4039-B995-7AF4CF82E9F8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.EntityFrameworkCore.Oracle.Devart", "src\Volo.Abp.EntityFrameworkCore.Oracle.Devart\Volo.Abp.EntityFrameworkCore.Oracle.Devart.csproj", "{75E5C841-5F36-4C44-A532-57CB8E7FFE15}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.EntityFrameworkCore.Oracle.Devart", "src\Volo.Abp.EntityFrameworkCore.Oracle.Devart\Volo.Abp.EntityFrameworkCore.Oracle.Devart.csproj", "{75E5C841-5F36-4C44-A532-57CB8E7FFE15}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring.Azure", "src\Volo.Abp.BlobStoring.Azure\Volo.Abp.BlobStoring.Azure.csproj", "{C44242F7-D55D-4867-AAF4-A786E404312E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.BlobStoring.Azure", "src\Volo.Abp.BlobStoring.Azure\Volo.Abp.BlobStoring.Azure.csproj", "{C44242F7-D55D-4867-AAF4-A786E404312E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring.Azure.Tests", "test\Volo.Abp.BlobStoring.Azure.Tests\Volo.Abp.BlobStoring.Azure.Tests.csproj", "{A80E9A0B-8932-4B5D-83FB-6751708FD484}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.BlobStoring.Azure.Tests", "test\Volo.Abp.BlobStoring.Azure.Tests\Volo.Abp.BlobStoring.Azure.Tests.csproj", "{A80E9A0B-8932-4B5D-83FB-6751708FD484}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring.Minio", "src\Volo.Abp.BlobStoring.Minio\Volo.Abp.BlobStoring.Minio.csproj", "{658D7EDE-A057-4256-96B6-083D3C2B9704}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring.Minio.Tests", "test\Volo.Abp.BlobStoring.Minio.Tests\Volo.Abp.BlobStoring.Minio.Tests.csproj", "{36D4B268-FD3A-4655-A41B-D56D68476C83}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -907,6 +911,14 @@ Global {A80E9A0B-8932-4B5D-83FB-6751708FD484}.Debug|Any CPU.Build.0 = Debug|Any CPU {A80E9A0B-8932-4B5D-83FB-6751708FD484}.Release|Any CPU.ActiveCfg = Release|Any CPU {A80E9A0B-8932-4B5D-83FB-6751708FD484}.Release|Any CPU.Build.0 = Release|Any CPU + {658D7EDE-A057-4256-96B6-083D3C2B9704}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {658D7EDE-A057-4256-96B6-083D3C2B9704}.Debug|Any CPU.Build.0 = Debug|Any CPU + {658D7EDE-A057-4256-96B6-083D3C2B9704}.Release|Any CPU.ActiveCfg = Release|Any CPU + {658D7EDE-A057-4256-96B6-083D3C2B9704}.Release|Any CPU.Build.0 = Release|Any CPU + {36D4B268-FD3A-4655-A41B-D56D68476C83}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {36D4B268-FD3A-4655-A41B-D56D68476C83}.Debug|Any CPU.Build.0 = Debug|Any CPU + {36D4B268-FD3A-4655-A41B-D56D68476C83}.Release|Any CPU.ActiveCfg = Release|Any CPU + {36D4B268-FD3A-4655-A41B-D56D68476C83}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1061,6 +1073,8 @@ Global {75E5C841-5F36-4C44-A532-57CB8E7FFE15} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {C44242F7-D55D-4867-AAF4-A786E404312E} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {A80E9A0B-8932-4B5D-83FB-6751708FD484} = {447C8A77-E5F0-4538-8687-7383196D04EA} + {658D7EDE-A057-4256-96B6-083D3C2B9704} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {36D4B268-FD3A-4655-A41B-D56D68476C83} = {447C8A77-E5F0-4538-8687-7383196D04EA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} diff --git a/framework/src/Volo.Abp.BlobStoring.Minio/FodyWeavers.xml b/framework/src/Volo.Abp.BlobStoring.Minio/FodyWeavers.xml new file mode 100644 index 0000000000..bc5a74a236 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring.Minio/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + diff --git a/framework/src/Volo.Abp.BlobStoring.Minio/FodyWeavers.xsd b/framework/src/Volo.Abp.BlobStoring.Minio/FodyWeavers.xsd new file mode 100644 index 0000000000..3f3946e282 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring.Minio/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/framework/src/Volo.Abp.BlobStoring.Minio/Volo.Abp.BlobStoring.Minio.csproj b/framework/src/Volo.Abp.BlobStoring.Minio/Volo.Abp.BlobStoring.Minio.csproj new file mode 100644 index 0000000000..1c080067ed --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring.Minio/Volo.Abp.BlobStoring.Minio.csproj @@ -0,0 +1,21 @@ + + + + + + netstandard2.0 + Volo.Abp.BlobStoring.Minio + Volo.Abp.BlobStoring.Minio + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + false + false + false + + + + + + + + + diff --git a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/AbpBlobStoringMinioModule.cs b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/AbpBlobStoringMinioModule.cs new file mode 100644 index 0000000000..00874dfe01 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/AbpBlobStoringMinioModule.cs @@ -0,0 +1,10 @@ +using Volo.Abp.Modularity; + +namespace Volo.Abp.BlobStoring.Minio +{ + [DependsOn(typeof(AbpBlobStoringModule))] + public class AbpBlobStoringMinioModule : AbpModule + { + + } +} diff --git a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/DefaultMinioBlobNameCalculator.cs b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/DefaultMinioBlobNameCalculator.cs new file mode 100644 index 0000000000..b6d35671e2 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/DefaultMinioBlobNameCalculator.cs @@ -0,0 +1,22 @@ +using Volo.Abp.DependencyInjection; +using Volo.Abp.MultiTenancy; + +namespace Volo.Abp.BlobStoring.Minio +{ + public class DefaultMinioBlobNameCalculator : IMinioBlobNameCalculator, ITransientDependency + { + protected ICurrentTenant CurrentTenant { get; } + + public DefaultMinioBlobNameCalculator(ICurrentTenant currentTenant) + { + CurrentTenant = currentTenant; + } + + public virtual string Calculate(BlobProviderArgs args) + { + return CurrentTenant.Id == null + ? $"host/{args.BlobName}" + : $"tenants/{CurrentTenant.Id.Value.ToString("D")}/{args.BlobName}"; + } + } +} diff --git a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/IMinioBlobNameCalculator.cs b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/IMinioBlobNameCalculator.cs new file mode 100644 index 0000000000..9cf7503648 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/IMinioBlobNameCalculator.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp.BlobStoring.Minio +{ + public interface IMinioBlobNameCalculator + { + string Calculate(BlobProviderArgs args); + } +} diff --git a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobContainerConfigurationExtensions.cs b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobContainerConfigurationExtensions.cs new file mode 100644 index 0000000000..3465914156 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobContainerConfigurationExtensions.cs @@ -0,0 +1,24 @@ +using System; + +namespace Volo.Abp.BlobStoring.Minio +{ + public static class MinioBlobContainerConfigurationExtensions + { + public static MinioBlobProviderConfiguration GetMinioConfiguration( + this BlobContainerConfiguration containerConfiguration) + { + return new MinioBlobProviderConfiguration(containerConfiguration); + } + + public static BlobContainerConfiguration UseMinio( + this BlobContainerConfiguration containerConfiguration, + Action minioConfigureAction) + { + containerConfiguration.ProviderType = typeof(MinioBlobProvider); + + minioConfigureAction(new MinioBlobProviderConfiguration(containerConfiguration)); + + return containerConfiguration; + } + } +} diff --git a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs new file mode 100644 index 0000000000..a958635f60 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs @@ -0,0 +1,159 @@ +using Minio; +using Minio.Exceptions; +using System; +using System.IO; +using System.Net; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.BlobStoring.Minio +{ + public class MinioBlobProvider : BlobProviderBase, ITransientDependency + { + protected IMinioBlobNameCalculator MinioBlobNameCalculator { get; } + + public MinioBlobProvider(IMinioBlobNameCalculator minioBlobNameCalculator) + { + MinioBlobNameCalculator = minioBlobNameCalculator; + } + + public override async Task SaveAsync(BlobProviderSaveArgs args) + { + var blobName = MinioBlobNameCalculator.Calculate(args); + var configuration = args.Configuration.GetMinioConfiguration(); + + if (!args.OverrideExisting && await BlobExistsAsync(args, blobName)) + { + throw new BlobAlreadyExistsException($"Saving BLOB '{args.BlobName}' does already exists in the container '{GetContainerName(args)}'! Set {nameof(args.OverrideExisting)} if it should be overwritten."); + } + + if (configuration.CreateBucketIfNotExists) + { + await CreateBucketIfNotExists(args); + } + + await GetMinioClient(args).PutObjectAsync(GetContainerName(args), blobName, args.BlobStream, args.BlobStream.Length); + } + + public override async Task DeleteAsync(BlobProviderDeleteArgs args) + { + var blobName = MinioBlobNameCalculator.Calculate(args); + + if (await BlobExistsAsync(args, blobName)) + { + var client = GetMinioClient(args); + await client.RemoveObjectAsync(GetContainerName(args), blobName); + return true; + } + + return false; + } + + public override async Task ExistsAsync(BlobProviderExistsArgs args) + { + var blobName = MinioBlobNameCalculator.Calculate(args); + + return await BlobExistsAsync(args, blobName); + } + + public override async Task GetOrNullAsync(BlobProviderGetArgs args) + { + var blobName = MinioBlobNameCalculator.Calculate(args); + + if (!await BlobExistsAsync(args, blobName)) + { + return null; + } + try + { + var client = GetMinioClient(args); + + var stat = await client.StatObjectAsync(GetContainerName(args), blobName); + + MemoryStream returnStream = new MemoryStream(); + + await client.GetObjectAsync(GetContainerName(args), blobName, + (stream) => + { + if (stream != null) + { + stream.CopyTo(returnStream); + + // returnStream = new MemoryStream(stream.GetAllBytes()); + + } + }); + + return returnStream; + } + catch (MinioException ex) + { + + } + return null; + + } + + + private MinioClient GetMinioClient(BlobProviderArgs args) + { + var configuration = args.Configuration.GetMinioConfiguration(); + var client = new MinioClient(configuration.EndPoint, configuration.AccessKey, configuration.SecretKey); + if (configuration.WithSSL) + { + client.WithSSL(); + } + + return client; + + } + + + + protected virtual async Task CreateBucketIfNotExists(BlobProviderArgs args) + { + var client = GetMinioClient(args); + var containerName = GetContainerName(args); + if (!await client.BucketExistsAsync(containerName)) + { + await client.MakeBucketAsync(containerName); + } + + } + + private async Task BlobExistsAsync(BlobProviderArgs args, string blobName) + { + // Make sure Blob Container exists. + if (await ContainerExistsAsync(args)) + { + try + { + await GetMinioClient(args).StatObjectAsync(GetContainerName(args), blobName); + return true; + } + catch (MinioException ex) + { + + } + } + return false; + + } + private static string GetContainerName(BlobProviderArgs args) + { + var configuration = args.Configuration.GetMinioConfiguration(); + + //minio bucket name must be lower + return configuration.BucketName.IsNullOrWhiteSpace() + ? args.ContainerName.ToLower() + : configuration.BucketName.ToLower(); + } + + private async Task ContainerExistsAsync(BlobProviderArgs args) + { + var client = GetMinioClient(args); + + return await client.BucketExistsAsync(GetContainerName(args)); + } + } +} diff --git a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProviderConfiguration.cs b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProviderConfiguration.cs new file mode 100644 index 0000000000..03e951a984 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProviderConfiguration.cs @@ -0,0 +1,65 @@ +namespace Volo.Abp.BlobStoring.Minio +{ + public class MinioBlobProviderConfiguration + { + public string BucketName + { + get => _containerConfiguration.GetConfiguration(MinioBlobProviderConfigurationNames.BucketName); + set => _containerConfiguration.SetConfiguration(MinioBlobProviderConfigurationNames.BucketName, Check.NotNullOrWhiteSpace(value, nameof(value))); + } + + /// + /// endPoint is an URL, domain name, IPv4 address or IPv6 address. + /// + public string EndPoint + { + get => _containerConfiguration.GetConfiguration(MinioBlobProviderConfigurationNames.EndPoint); + set => _containerConfiguration.SetConfiguration(MinioBlobProviderConfigurationNames.EndPoint, Check.NotNullOrWhiteSpace(value, nameof(value))); + } + + /// + /// accessKey is like user-id that uniquely identifies your account.This field is optional and can be omitted for anonymous access. + /// + public string AccessKey + { + get => _containerConfiguration.GetConfiguration(MinioBlobProviderConfigurationNames.AccessKey); + set => _containerConfiguration.SetConfiguration(MinioBlobProviderConfigurationNames.AccessKey, Check.NotNullOrWhiteSpace(value, nameof(value))); + } + + /// + /// secretKey is the password to your account.This field is optional and can be omitted for anonymous access. + /// + public string SecretKey + { + get => _containerConfiguration.GetConfiguration(MinioBlobProviderConfigurationNames.SecretKey); + set => _containerConfiguration.SetConfiguration(MinioBlobProviderConfigurationNames.SecretKey, Check.NotNullOrWhiteSpace(value, nameof(value))); + } + + /// + ///connect to to MinIO Client object to use https instead of http + /// + public bool WithSSL + { + get => _containerConfiguration.GetConfigurationOrDefault(MinioBlobProviderConfigurationNames.WithSSL, false); + set => _containerConfiguration.SetConfiguration(MinioBlobProviderConfigurationNames.WithSSL, value); + } + + + + /// + ///Default value: false. + /// + public bool CreateBucketIfNotExists + { + get => _containerConfiguration.GetConfigurationOrDefault(MinioBlobProviderConfigurationNames.CreateBucketIfNotExists, false); + set => _containerConfiguration.SetConfiguration(MinioBlobProviderConfigurationNames.CreateBucketIfNotExists, value); + } + + private readonly BlobContainerConfiguration _containerConfiguration; + + public MinioBlobProviderConfiguration(BlobContainerConfiguration containerConfiguration) + { + _containerConfiguration = containerConfiguration; + } + } +} diff --git a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProviderConfigurationNames.cs b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProviderConfigurationNames.cs new file mode 100644 index 0000000000..3c12d98390 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProviderConfigurationNames.cs @@ -0,0 +1,12 @@ +namespace Volo.Abp.BlobStoring.Minio +{ + public static class MinioBlobProviderConfigurationNames + { + public const string BucketName = "Minio.BucketName"; + public const string EndPoint = "Minio.EndPoint"; + public const string AccessKey = "Minio.AccessKey"; + public const string SecretKey = "Minio.SecretKey"; + public const string WithSSL = "Minio.WithSSL"; + public const string CreateBucketIfNotExists = "Minio.CreateBucketIfNotExists"; + } +} diff --git a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo.Abp.BlobStoring.Minio.Tests.csproj b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo.Abp.BlobStoring.Minio.Tests.csproj new file mode 100644 index 0000000000..49f7050734 --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo.Abp.BlobStoring.Minio.Tests.csproj @@ -0,0 +1,17 @@ + + + + netcoreapp3.1 + + 9f0d2c00-80c1-435b-bfab-2c39c8249091 + + + + + + + + + + + diff --git a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/AbpBlobStoringMinioTestBase.cs b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/AbpBlobStoringMinioTestBase.cs new file mode 100644 index 0000000000..c15f093e58 --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/AbpBlobStoringMinioTestBase.cs @@ -0,0 +1,20 @@ +using Volo.Abp.Testing; + +namespace Volo.Abp.BlobStoring.Minio +{ + public class AbpBlobStoringMinioTestCommonBase : AbpIntegratedTest + { + protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) + { + options.UseAutofac(); + } + } + + public class AbpBlobStoringMinioTestBase : AbpIntegratedTest + { + protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) + { + options.UseAutofac(); + } + } +} diff --git a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/AbpBlobStoringMinioTestModule.cs b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/AbpBlobStoringMinioTestModule.cs new file mode 100644 index 0000000000..cfe7b5b4cf --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/AbpBlobStoringMinioTestModule.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Minio; +using Volo.Abp.Modularity; + +namespace Volo.Abp.BlobStoring.Minio +{ + + [DependsOn( + typeof(AbpBlobStoringMinioModule), + typeof(AbpBlobStoringTestModule) + )] + public class AbpBlobStoringMinioTestCommonModule : AbpModule + { + + } + + [DependsOn( + typeof(AbpBlobStoringMinioTestCommonModule) + )] + public class AbpBlobStoringMinioTestModule : AbpModule + { + private const string UserSecretsId = "9f0d2c00-80c1-435b-bfab-2c39c8249091"; + + private string _endPoint; + private string _accessKey; + private string _secretKey; + + + private readonly string _randomContainerName = "abp-minio-test-container-" + Guid.NewGuid().ToString("N"); + + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.ReplaceConfiguration(ConfigurationHelper.BuildConfiguration(builderAction: builder => + { + builder.AddUserSecrets(UserSecretsId); + })); + + var configuration = context.Services.GetConfiguration(); + _endPoint = configuration["Minio:EndPoint"]; + _accessKey = configuration["Minio:AccessKey"]; + _secretKey = configuration["Minio:SecretKey"]; + + Configure(options => + { + options.Containers.ConfigureAll((containerName, containerConfiguration) => + { + containerConfiguration.UseMinio(minio => + { + minio.EndPoint = _endPoint; + minio.AccessKey = _accessKey; + minio.SecretKey = _secretKey; + minio.WithSSL = false; + minio.BucketName = _randomContainerName; + minio.CreateBucketIfNotExists = true; + }); + }); + }); + } + + public async override void OnApplicationShutdown(ApplicationShutdownContext context) + { + var minioClient = new MinioClient(_endPoint, _accessKey, _secretKey); + if (await minioClient.BucketExistsAsync(_randomContainerName)) + { + var observables =minioClient.ListObjectsAsync(_randomContainerName,null,true); + var objectNames = new List(); + IDisposable subscription = observables.Subscribe( + async item => await minioClient.RemoveObjectAsync(_randomContainerName, item.Key), + async () => await minioClient.RemoveBucketAsync(_randomContainerName) + ); + + } + + } + } + +} diff --git a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobContainer_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobContainer_Tests.cs new file mode 100644 index 0000000000..5c38b098d5 --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobContainer_Tests.cs @@ -0,0 +1,16 @@ +using Xunit; + +namespace Volo.Abp.BlobStoring.Minio +{ + + ////Please set the correct connection string in secrets.json and continue the test. + + //public class MinioBlobContainer_Tests : BlobContainer_Tests + //{ + // public MinioBlobContainer_Tests() + // { + + // } + //} + +} diff --git a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobNameCalculator_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobNameCalculator_Tests.cs new file mode 100644 index 0000000000..712c849965 --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobNameCalculator_Tests.cs @@ -0,0 +1,57 @@ +using System; +using Shouldly; +using Volo.Abp.MultiTenancy; +using Xunit; + +namespace Volo.Abp.BlobStoring.Minio +{ + public class MinioBlobNameCalculator_Tests : AbpBlobStoringMinioTestCommonBase + { + private readonly IMinioBlobNameCalculator _calculator; + private readonly ICurrentTenant _currentTenant; + + private const string MinioContainerName = "/"; + private const string MinioSeparator = "/"; + + public MinioBlobNameCalculator_Tests() + { + _calculator = GetRequiredService(); + _currentTenant = GetRequiredService(); + } + + [Fact] + public void Default_Settings() + { + _calculator.Calculate( + GetArgs("my-container", "my-blob") + ).ShouldBe($"host{MinioSeparator}my-blob"); + } + + [Fact] + public void Default_Settings_With_TenantId() + { + var tenantId = Guid.NewGuid(); + + using (_currentTenant.Change(tenantId)) + { + _calculator.Calculate( + GetArgs("my-container", "my-blob") + ).ShouldBe($"tenants{MinioSeparator}{tenantId:D}{MinioSeparator}my-blob"); + } + } + + private static BlobProviderArgs GetArgs( + string containerName, + string blobName) + { + return new BlobProviderGetArgs( + containerName, + new BlobContainerConfiguration().UseMinio(x => + { + x.BucketName = containerName; + }), + blobName + ); + } + } +} From e0c873bd4e6780ce94e993845bffebc813ba67d4 Mon Sep 17 00:00:00 2001 From: "nuck.tang" Date: Wed, 8 Jul 2020 17:20:09 +0800 Subject: [PATCH 02/20] merge master --- .../Properties/launchSettings.json | 27 +++++++++++++++++++ .../Properties/launchSettings.json | 27 +++++++++++++++++++ .../Properties/launchSettings.json | 27 +++++++++++++++++++ .../Properties/launchSettings.json | 27 +++++++++++++++++++ .../Properties/launchSettings.json | 27 +++++++++++++++++++ .../Properties/launchSettings.json | 27 +++++++++++++++++++ .../Properties/launchSettings.json | 27 +++++++++++++++++++ .../Properties/launchSettings.json | 27 +++++++++++++++++++ 8 files changed, 216 insertions(+) create mode 100644 framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Properties/launchSettings.json create mode 100644 framework/src/Volo.Abp.AspNetCore.MultiTenancy/Properties/launchSettings.json create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.Client/Properties/launchSettings.json create mode 100644 framework/src/Volo.Abp.AspNetCore.Serilog/Properties/launchSettings.json create mode 100644 framework/src/Volo.Abp.AspNetCore.SignalR/Properties/launchSettings.json create mode 100644 framework/src/Volo.Abp.AspNetCore.TestBase/Properties/launchSettings.json create mode 100644 framework/src/Volo.Abp.AspNetCore/Properties/launchSettings.json create mode 100644 framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Properties/launchSettings.json diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Properties/launchSettings.json new file mode 100644 index 0000000000..6aa4a1fced --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:60139/", + "sslPort": 44367 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Volo.Abp.AspNetCore.Authentication.OAuth": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:5001;http://localhost:5000" + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Properties/launchSettings.json new file mode 100644 index 0000000000..9b0e2c02f7 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:60131/", + "sslPort": 44355 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Volo.Abp.AspNetCore.MultiTenancy": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:5001;http://localhost:5000" + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Properties/launchSettings.json new file mode 100644 index 0000000000..f8bbfa52e8 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:60151/", + "sslPort": 44329 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Volo.Abp.AspNetCore.Mvc.Client": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:5001;http://localhost:5000" + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Serilog/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.Serilog/Properties/launchSettings.json new file mode 100644 index 0000000000..2dd401a372 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Serilog/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:60158/", + "sslPort": 44386 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Volo.Abp.AspNetCore.Serilog": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:5001;http://localhost:5000" + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.SignalR/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.SignalR/Properties/launchSettings.json new file mode 100644 index 0000000000..1610a416a4 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.SignalR/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:60162/", + "sslPort": 44316 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Volo.Abp.AspNetCore.SignalR": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:5001;http://localhost:5000" + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.TestBase/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.TestBase/Properties/launchSettings.json new file mode 100644 index 0000000000..6bf117bcaa --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.TestBase/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:60133/", + "sslPort": 44330 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Volo.Abp.AspNetCore.TestBase": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:5001;http://localhost:5000" + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore/Properties/launchSettings.json new file mode 100644 index 0000000000..3f7ffeb78d --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:60130/", + "sslPort": 44344 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Volo.Abp.AspNetCore": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:5001;http://localhost:5000" + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Properties/launchSettings.json b/framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Properties/launchSettings.json new file mode 100644 index 0000000000..50d577043d --- /dev/null +++ b/framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:60160/", + "sslPort": 44314 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Volo.Abp.Http.Client.IdentityModel.Web": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:5001;http://localhost:5000" + } + } +} \ No newline at end of file From e18b664481780a8f6be6192706437019bfb4e866 Mon Sep 17 00:00:00 2001 From: "nuck.tang" Date: Wed, 8 Jul 2020 17:21:10 +0800 Subject: [PATCH 03/20] Merge branch 'master' of https://github.com/abpframework/abp into miniostoring # Conflicts: # framework/Volo.Abp.sln --- framework/Volo.Abp.sln | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index 89e3f3086f..2c278425cb 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -305,15 +305,15 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.BlobStoring.Azure" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.BlobStoring.Azure.Tests", "test\Volo.Abp.BlobStoring.Azure.Tests\Volo.Abp.BlobStoring.Azure.Tests.csproj", "{A80E9A0B-8932-4B5D-83FB-6751708FD484}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring.Minio", "src\Volo.Abp.BlobStoring.Minio\Volo.Abp.BlobStoring.Minio.csproj", "{658D7EDE-A057-4256-96B6-083D3C2B9704}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.BlobStoring.Minio", "src\Volo.Abp.BlobStoring.Minio\Volo.Abp.BlobStoring.Minio.csproj", "{658D7EDE-A057-4256-96B6-083D3C2B9704}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring.Minio.Tests", "test\Volo.Abp.BlobStoring.Minio.Tests\Volo.Abp.BlobStoring.Minio.Tests.csproj", "{36D4B268-FD3A-4655-A41B-D56D68476C83}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.BlobStoring.Minio.Tests", "test\Volo.Abp.BlobStoring.Minio.Tests\Volo.Abp.BlobStoring.Minio.Tests.csproj", "{36D4B268-FD3A-4655-A41B-D56D68476C83}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.EntityFrameworkCore.Oracle", "src\Volo.Abp.EntityFrameworkCore.Oracle\Volo.Abp.EntityFrameworkCore.Oracle.csproj", "{1738845A-5348-4EB8-B736-CD1D22A808B4}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.EntityFrameworkCore.Oracle", "src\Volo.Abp.EntityFrameworkCore.Oracle\Volo.Abp.EntityFrameworkCore.Oracle.csproj", "{1738845A-5348-4EB8-B736-CD1D22A808B4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Caching.StackExchangeRedis", "src\Volo.Abp.Caching.StackExchangeRedis\Volo.Abp.Caching.StackExchangeRedis.csproj", "{2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Caching.StackExchangeRedis", "src\Volo.Abp.Caching.StackExchangeRedis\Volo.Abp.Caching.StackExchangeRedis.csproj", "{2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Caching.StackExchangeRedis.Tests", "test\Volo.Abp.Caching.StackExchangeRedis.Tests\Volo.Abp.Caching.StackExchangeRedis.Tests.csproj", "{60D0E384-965E-4F81-9D71-B28F419254FC}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Caching.StackExchangeRedis.Tests", "test\Volo.Abp.Caching.StackExchangeRedis.Tests\Volo.Abp.Caching.StackExchangeRedis.Tests.csproj", "{60D0E384-965E-4F81-9D71-B28F419254FC}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -917,6 +917,14 @@ Global {A80E9A0B-8932-4B5D-83FB-6751708FD484}.Debug|Any CPU.Build.0 = Debug|Any CPU {A80E9A0B-8932-4B5D-83FB-6751708FD484}.Release|Any CPU.ActiveCfg = Release|Any CPU {A80E9A0B-8932-4B5D-83FB-6751708FD484}.Release|Any CPU.Build.0 = Release|Any CPU + {658D7EDE-A057-4256-96B6-083D3C2B9704}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {658D7EDE-A057-4256-96B6-083D3C2B9704}.Debug|Any CPU.Build.0 = Debug|Any CPU + {658D7EDE-A057-4256-96B6-083D3C2B9704}.Release|Any CPU.ActiveCfg = Release|Any CPU + {658D7EDE-A057-4256-96B6-083D3C2B9704}.Release|Any CPU.Build.0 = Release|Any CPU + {36D4B268-FD3A-4655-A41B-D56D68476C83}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {36D4B268-FD3A-4655-A41B-D56D68476C83}.Debug|Any CPU.Build.0 = Debug|Any CPU + {36D4B268-FD3A-4655-A41B-D56D68476C83}.Release|Any CPU.ActiveCfg = Release|Any CPU + {36D4B268-FD3A-4655-A41B-D56D68476C83}.Release|Any CPU.Build.0 = Release|Any CPU {1738845A-5348-4EB8-B736-CD1D22A808B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1738845A-5348-4EB8-B736-CD1D22A808B4}.Debug|Any CPU.Build.0 = Debug|Any CPU {1738845A-5348-4EB8-B736-CD1D22A808B4}.Release|Any CPU.ActiveCfg = Release|Any CPU From 80a9614660ce130350840b27f3c9e0bfbfd5c2be Mon Sep 17 00:00:00 2001 From: "nuck.tang" Date: Thu, 9 Jul 2020 09:45:23 +0800 Subject: [PATCH 04/20] update sdk --- framework/Volo.Abp.sln | 2 ++ .../Volo.Abp.BlobStoring.Minio.Tests.csproj | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index 2c278425cb..63162ef88b 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -1091,6 +1091,8 @@ Global {75E5C841-5F36-4C44-A532-57CB8E7FFE15} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {C44242F7-D55D-4867-AAF4-A786E404312E} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {A80E9A0B-8932-4B5D-83FB-6751708FD484} = {447C8A77-E5F0-4538-8687-7383196D04EA} + {658D7EDE-A057-4256-96B6-083D3C2B9704} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {36D4B268-FD3A-4655-A41B-D56D68476C83} = {447C8A77-E5F0-4538-8687-7383196D04EA} {1738845A-5348-4EB8-B736-CD1D22A808B4} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {60D0E384-965E-4F81-9D71-B28F419254FC} = {447C8A77-E5F0-4538-8687-7383196D04EA} diff --git a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo.Abp.BlobStoring.Minio.Tests.csproj b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo.Abp.BlobStoring.Minio.Tests.csproj index 49f7050734..388efc88a2 100644 --- a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo.Abp.BlobStoring.Minio.Tests.csproj +++ b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo.Abp.BlobStoring.Minio.Tests.csproj @@ -10,7 +10,7 @@ - + From c2b4833dd57c7791f700e9d939ca710a17c4896f Mon Sep 17 00:00:00 2001 From: mhymhygi <274871620@qq.com> Date: Thu, 9 Jul 2020 10:46:58 +0800 Subject: [PATCH 05/20] Delete launchSettings.json --- .../Properties/launchSettings.json | 27 ------------------- 1 file changed, 27 deletions(-) delete mode 100644 framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Properties/launchSettings.json diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Properties/launchSettings.json deleted file mode 100644 index 6aa4a1fced..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:60139/", - "sslPort": 44367 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.AspNetCore.Authentication.OAuth": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "https://localhost:5001;http://localhost:5000" - } - } -} \ No newline at end of file From ecdd758776f36fc648c3a77a85819c5578b9e965 Mon Sep 17 00:00:00 2001 From: mhymhygi <274871620@qq.com> Date: Thu, 9 Jul 2020 10:47:53 +0800 Subject: [PATCH 06/20] Delete launchSettings.json --- .../Properties/launchSettings.json | 27 ------------------- 1 file changed, 27 deletions(-) delete mode 100644 framework/src/Volo.Abp.AspNetCore.MultiTenancy/Properties/launchSettings.json diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Properties/launchSettings.json deleted file mode 100644 index 9b0e2c02f7..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:60131/", - "sslPort": 44355 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.AspNetCore.MultiTenancy": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "https://localhost:5001;http://localhost:5000" - } - } -} \ No newline at end of file From b8e075aeb43b646a22a249ac14c8ba4efd41d9b4 Mon Sep 17 00:00:00 2001 From: mhymhygi <274871620@qq.com> Date: Thu, 9 Jul 2020 10:48:14 +0800 Subject: [PATCH 07/20] Delete launchSettings.json --- .../Properties/launchSettings.json | 27 ------------------- 1 file changed, 27 deletions(-) delete mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.Client/Properties/launchSettings.json diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Properties/launchSettings.json deleted file mode 100644 index f8bbfa52e8..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:60151/", - "sslPort": 44329 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.AspNetCore.Mvc.Client": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "https://localhost:5001;http://localhost:5000" - } - } -} \ No newline at end of file From 2257bf52b5071573f65fd17195574d4fce6630a6 Mon Sep 17 00:00:00 2001 From: mhymhygi <274871620@qq.com> Date: Thu, 9 Jul 2020 10:48:52 +0800 Subject: [PATCH 08/20] Delete launchSettings.json --- .../Properties/launchSettings.json | 27 ------------------- 1 file changed, 27 deletions(-) delete mode 100644 framework/src/Volo.Abp.AspNetCore.Serilog/Properties/launchSettings.json diff --git a/framework/src/Volo.Abp.AspNetCore.Serilog/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.Serilog/Properties/launchSettings.json deleted file mode 100644 index 2dd401a372..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.Serilog/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:60158/", - "sslPort": 44386 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.AspNetCore.Serilog": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "https://localhost:5001;http://localhost:5000" - } - } -} \ No newline at end of file From 3d86d6e9d9e682616d097448f31164c4bd05f5e0 Mon Sep 17 00:00:00 2001 From: mhymhygi <274871620@qq.com> Date: Thu, 9 Jul 2020 10:49:25 +0800 Subject: [PATCH 09/20] Delete launchSettings.json --- .../Properties/launchSettings.json | 27 ------------------- 1 file changed, 27 deletions(-) delete mode 100644 framework/src/Volo.Abp.AspNetCore.SignalR/Properties/launchSettings.json diff --git a/framework/src/Volo.Abp.AspNetCore.SignalR/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.SignalR/Properties/launchSettings.json deleted file mode 100644 index 1610a416a4..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.SignalR/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:60162/", - "sslPort": 44316 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.AspNetCore.SignalR": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "https://localhost:5001;http://localhost:5000" - } - } -} \ No newline at end of file From 2c322035c387b4f495a5ff924560a07797ac50f8 Mon Sep 17 00:00:00 2001 From: mhymhygi <274871620@qq.com> Date: Thu, 9 Jul 2020 10:50:57 +0800 Subject: [PATCH 10/20] Delete launchSettings.json --- .../Properties/launchSettings.json | 27 ------------------- 1 file changed, 27 deletions(-) delete mode 100644 framework/src/Volo.Abp.AspNetCore.TestBase/Properties/launchSettings.json diff --git a/framework/src/Volo.Abp.AspNetCore.TestBase/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore.TestBase/Properties/launchSettings.json deleted file mode 100644 index 6bf117bcaa..0000000000 --- a/framework/src/Volo.Abp.AspNetCore.TestBase/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:60133/", - "sslPort": 44330 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.AspNetCore.TestBase": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "https://localhost:5001;http://localhost:5000" - } - } -} \ No newline at end of file From f0ffde0ef581ba6815a56fa789e39fcc01846cea Mon Sep 17 00:00:00 2001 From: "nuck.tang" Date: Thu, 9 Jul 2020 11:16:30 +0800 Subject: [PATCH 11/20] undo some wrong submit --- framework/Volo.Abp.sln | 20 ++++++++++++++----- .../Volo.Abp.BlobStoring.Minio.Tests.csproj | 2 +- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index 89e3f3086f..63162ef88b 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -305,15 +305,15 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.BlobStoring.Azure" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.BlobStoring.Azure.Tests", "test\Volo.Abp.BlobStoring.Azure.Tests\Volo.Abp.BlobStoring.Azure.Tests.csproj", "{A80E9A0B-8932-4B5D-83FB-6751708FD484}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring.Minio", "src\Volo.Abp.BlobStoring.Minio\Volo.Abp.BlobStoring.Minio.csproj", "{658D7EDE-A057-4256-96B6-083D3C2B9704}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.BlobStoring.Minio", "src\Volo.Abp.BlobStoring.Minio\Volo.Abp.BlobStoring.Minio.csproj", "{658D7EDE-A057-4256-96B6-083D3C2B9704}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring.Minio.Tests", "test\Volo.Abp.BlobStoring.Minio.Tests\Volo.Abp.BlobStoring.Minio.Tests.csproj", "{36D4B268-FD3A-4655-A41B-D56D68476C83}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.BlobStoring.Minio.Tests", "test\Volo.Abp.BlobStoring.Minio.Tests\Volo.Abp.BlobStoring.Minio.Tests.csproj", "{36D4B268-FD3A-4655-A41B-D56D68476C83}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.EntityFrameworkCore.Oracle", "src\Volo.Abp.EntityFrameworkCore.Oracle\Volo.Abp.EntityFrameworkCore.Oracle.csproj", "{1738845A-5348-4EB8-B736-CD1D22A808B4}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.EntityFrameworkCore.Oracle", "src\Volo.Abp.EntityFrameworkCore.Oracle\Volo.Abp.EntityFrameworkCore.Oracle.csproj", "{1738845A-5348-4EB8-B736-CD1D22A808B4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Caching.StackExchangeRedis", "src\Volo.Abp.Caching.StackExchangeRedis\Volo.Abp.Caching.StackExchangeRedis.csproj", "{2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Caching.StackExchangeRedis", "src\Volo.Abp.Caching.StackExchangeRedis\Volo.Abp.Caching.StackExchangeRedis.csproj", "{2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Caching.StackExchangeRedis.Tests", "test\Volo.Abp.Caching.StackExchangeRedis.Tests\Volo.Abp.Caching.StackExchangeRedis.Tests.csproj", "{60D0E384-965E-4F81-9D71-B28F419254FC}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Caching.StackExchangeRedis.Tests", "test\Volo.Abp.Caching.StackExchangeRedis.Tests\Volo.Abp.Caching.StackExchangeRedis.Tests.csproj", "{60D0E384-965E-4F81-9D71-B28F419254FC}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -917,6 +917,14 @@ Global {A80E9A0B-8932-4B5D-83FB-6751708FD484}.Debug|Any CPU.Build.0 = Debug|Any CPU {A80E9A0B-8932-4B5D-83FB-6751708FD484}.Release|Any CPU.ActiveCfg = Release|Any CPU {A80E9A0B-8932-4B5D-83FB-6751708FD484}.Release|Any CPU.Build.0 = Release|Any CPU + {658D7EDE-A057-4256-96B6-083D3C2B9704}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {658D7EDE-A057-4256-96B6-083D3C2B9704}.Debug|Any CPU.Build.0 = Debug|Any CPU + {658D7EDE-A057-4256-96B6-083D3C2B9704}.Release|Any CPU.ActiveCfg = Release|Any CPU + {658D7EDE-A057-4256-96B6-083D3C2B9704}.Release|Any CPU.Build.0 = Release|Any CPU + {36D4B268-FD3A-4655-A41B-D56D68476C83}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {36D4B268-FD3A-4655-A41B-D56D68476C83}.Debug|Any CPU.Build.0 = Debug|Any CPU + {36D4B268-FD3A-4655-A41B-D56D68476C83}.Release|Any CPU.ActiveCfg = Release|Any CPU + {36D4B268-FD3A-4655-A41B-D56D68476C83}.Release|Any CPU.Build.0 = Release|Any CPU {1738845A-5348-4EB8-B736-CD1D22A808B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1738845A-5348-4EB8-B736-CD1D22A808B4}.Debug|Any CPU.Build.0 = Debug|Any CPU {1738845A-5348-4EB8-B736-CD1D22A808B4}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -1083,6 +1091,8 @@ Global {75E5C841-5F36-4C44-A532-57CB8E7FFE15} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {C44242F7-D55D-4867-AAF4-A786E404312E} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {A80E9A0B-8932-4B5D-83FB-6751708FD484} = {447C8A77-E5F0-4538-8687-7383196D04EA} + {658D7EDE-A057-4256-96B6-083D3C2B9704} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {36D4B268-FD3A-4655-A41B-D56D68476C83} = {447C8A77-E5F0-4538-8687-7383196D04EA} {1738845A-5348-4EB8-B736-CD1D22A808B4} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {60D0E384-965E-4F81-9D71-B28F419254FC} = {447C8A77-E5F0-4538-8687-7383196D04EA} diff --git a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo.Abp.BlobStoring.Minio.Tests.csproj b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo.Abp.BlobStoring.Minio.Tests.csproj index 49f7050734..388efc88a2 100644 --- a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo.Abp.BlobStoring.Minio.Tests.csproj +++ b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo.Abp.BlobStoring.Minio.Tests.csproj @@ -10,7 +10,7 @@ - + From 599a7655eabed273e303066c839ac96570a759c9 Mon Sep 17 00:00:00 2001 From: "nuck.tang" Date: Thu, 9 Jul 2020 11:40:44 +0800 Subject: [PATCH 12/20] remove lanuchSettings.json --- .../Properties/launchSettings.json | 27 ------------------- .../Properties/launchSettings.json | 27 ------------------- ...o.Abp.Http.Client.IdentityModel.Web.csproj | 4 +++ 3 files changed, 4 insertions(+), 54 deletions(-) delete mode 100644 framework/src/Volo.Abp.AspNetCore/Properties/launchSettings.json delete mode 100644 framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Properties/launchSettings.json diff --git a/framework/src/Volo.Abp.AspNetCore/Properties/launchSettings.json b/framework/src/Volo.Abp.AspNetCore/Properties/launchSettings.json deleted file mode 100644 index 3f7ffeb78d..0000000000 --- a/framework/src/Volo.Abp.AspNetCore/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:60130/", - "sslPort": 44344 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.AspNetCore": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "https://localhost:5001;http://localhost:5000" - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Properties/launchSettings.json b/framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Properties/launchSettings.json deleted file mode 100644 index 50d577043d..0000000000 --- a/framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:60160/", - "sslPort": 44314 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Volo.Abp.Http.Client.IdentityModel.Web": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "https://localhost:5001;http://localhost:5000" - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Volo.Abp.Http.Client.IdentityModel.Web.csproj b/framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Volo.Abp.Http.Client.IdentityModel.Web.csproj index 1518da9045..449521a6f8 100644 --- a/framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Volo.Abp.Http.Client.IdentityModel.Web.csproj +++ b/framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Volo.Abp.Http.Client.IdentityModel.Web.csproj @@ -20,4 +20,8 @@ + + + + From 782fafd5f2b04801ebf9628adb9889e3cb9466d5 Mon Sep 17 00:00:00 2001 From: "nuck.tang" Date: Thu, 9 Jul 2020 11:49:50 +0800 Subject: [PATCH 13/20] remove Propertiesfloder --- .../Volo.Abp.Http.Client.IdentityModel.Web.csproj | 4 ---- 1 file changed, 4 deletions(-) diff --git a/framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Volo.Abp.Http.Client.IdentityModel.Web.csproj b/framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Volo.Abp.Http.Client.IdentityModel.Web.csproj index 449521a6f8..1518da9045 100644 --- a/framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Volo.Abp.Http.Client.IdentityModel.Web.csproj +++ b/framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Volo.Abp.Http.Client.IdentityModel.Web.csproj @@ -20,8 +20,4 @@ - - - - From 49ad1409eb4a8731c839f45ac6b3bceff12aad5a Mon Sep 17 00:00:00 2001 From: "nuck.tang" Date: Fri, 10 Jul 2020 11:00:56 +0800 Subject: [PATCH 14/20] Code refactoring --- .../BlobStoring/Minio/MinioBlobProvider.cs | 102 +++++++++--------- .../Minio/MinioBlobContainer_Tests.cs | 17 +-- 2 files changed, 60 insertions(+), 59 deletions(-) diff --git a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs index a958635f60..5ecdfea5d4 100644 --- a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs @@ -21,28 +21,31 @@ namespace Volo.Abp.BlobStoring.Minio { var blobName = MinioBlobNameCalculator.Calculate(args); var configuration = args.Configuration.GetMinioConfiguration(); + var client = GetMinioClient(args); + var containerName = GetContainerName(args); - if (!args.OverrideExisting && await BlobExistsAsync(args, blobName)) + if (!args.OverrideExisting && await BlobExistsAsync(client, containerName, blobName)) { - throw new BlobAlreadyExistsException($"Saving BLOB '{args.BlobName}' does already exists in the container '{GetContainerName(args)}'! Set {nameof(args.OverrideExisting)} if it should be overwritten."); + throw new BlobAlreadyExistsException($"Saving BLOB '{args.BlobName}' does already exists in the container '{containerName}'! Set {nameof(args.OverrideExisting)} if it should be overwritten."); } if (configuration.CreateBucketIfNotExists) { - await CreateBucketIfNotExists(args); + await CreateBucketIfNotExists(client, containerName); } - await GetMinioClient(args).PutObjectAsync(GetContainerName(args), blobName, args.BlobStream, args.BlobStream.Length); + await client.PutObjectAsync(containerName, blobName, args.BlobStream, args.BlobStream.Length); } public override async Task DeleteAsync(BlobProviderDeleteArgs args) { var blobName = MinioBlobNameCalculator.Calculate(args); + var client = GetMinioClient(args); + var containerName = GetContainerName(args); - if (await BlobExistsAsync(args, blobName)) + if (await BlobExistsAsync(client, containerName, blobName)) { - var client = GetMinioClient(args); - await client.RemoveObjectAsync(GetContainerName(args), blobName); + await client.RemoveObjectAsync(containerName, blobName); return true; } @@ -52,45 +55,37 @@ namespace Volo.Abp.BlobStoring.Minio public override async Task ExistsAsync(BlobProviderExistsArgs args) { var blobName = MinioBlobNameCalculator.Calculate(args); + var client = GetMinioClient(args); + var containerName = GetContainerName(args); - return await BlobExistsAsync(args, blobName); + return await BlobExistsAsync(client, containerName, blobName); } public override async Task GetOrNullAsync(BlobProviderGetArgs args) { var blobName = MinioBlobNameCalculator.Calculate(args); - - if (!await BlobExistsAsync(args, blobName)) + var client = GetMinioClient(args); + var containerName = GetContainerName(args); + if (!await BlobExistsAsync(client, containerName, blobName)) { return null; - } - try - { - var client = GetMinioClient(args); - - var stat = await client.StatObjectAsync(GetContainerName(args), blobName); - - MemoryStream returnStream = new MemoryStream(); - - await client.GetObjectAsync(GetContainerName(args), blobName, - (stream) => - { - if (stream != null) - { - stream.CopyTo(returnStream); - - // returnStream = new MemoryStream(stream.GetAllBytes()); - - } - }); - - return returnStream; - } - catch (MinioException ex) - { - - } - return null; + } + + var memoryStream = new MemoryStream(); + await client.GetObjectAsync(containerName, blobName, + (stream) => + { + if (stream != null) + { + stream.CopyTo(memoryStream); + } + else + { + memoryStream = null; + } + }); + + return memoryStream; } @@ -99,6 +94,7 @@ namespace Volo.Abp.BlobStoring.Minio { var configuration = args.Configuration.GetMinioConfiguration(); var client = new MinioClient(configuration.EndPoint, configuration.AccessKey, configuration.SecretKey); + if (configuration.WithSSL) { client.WithSSL(); @@ -110,10 +106,8 @@ namespace Volo.Abp.BlobStoring.Minio - protected virtual async Task CreateBucketIfNotExists(BlobProviderArgs args) + protected virtual async Task CreateBucketIfNotExists(MinioClient client,string containerName) { - var client = GetMinioClient(args); - var containerName = GetContainerName(args); if (!await client.BucketExistsAsync(containerName)) { await client.MakeBucketAsync(containerName); @@ -121,21 +115,31 @@ namespace Volo.Abp.BlobStoring.Minio } - private async Task BlobExistsAsync(BlobProviderArgs args, string blobName) + private async Task BlobExistsAsync(MinioClient client, string containerName , string blobName) { // Make sure Blob Container exists. - if (await ContainerExistsAsync(args)) + if (await client.BucketExistsAsync(containerName)) { try { - await GetMinioClient(args).StatObjectAsync(GetContainerName(args), blobName); + // Check whether the object exists using statObject(). + // If the object is not found, statObject() throws an exception, + // else it means that the object exists. + // Execution is successful. + await client.StatObjectAsync(containerName, blobName); return true; } catch (MinioException ex) - { + { + if(ex is ObjectNotFoundException) + { + return false; + } + throw ex; } } + return false; } @@ -143,17 +147,11 @@ namespace Volo.Abp.BlobStoring.Minio { var configuration = args.Configuration.GetMinioConfiguration(); - //minio bucket name must be lower + //Minio bucket name must be lowercase return configuration.BucketName.IsNullOrWhiteSpace() ? args.ContainerName.ToLower() : configuration.BucketName.ToLower(); } - private async Task ContainerExistsAsync(BlobProviderArgs args) - { - var client = GetMinioClient(args); - - return await client.BucketExistsAsync(GetContainerName(args)); - } } } diff --git a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobContainer_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobContainer_Tests.cs index 5c38b098d5..fe41807a72 100644 --- a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobContainer_Tests.cs +++ b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobContainer_Tests.cs @@ -1,16 +1,19 @@ -using Xunit; +using Shouldly; +using System.Threading.Tasks; +using Xunit; namespace Volo.Abp.BlobStoring.Minio { ////Please set the correct connection string in secrets.json and continue the test. - //public class MinioBlobContainer_Tests : BlobContainer_Tests - //{ - // public MinioBlobContainer_Tests() - // { + public class MinioBlobContainer_Tests : BlobContainer_Tests + { + public MinioBlobContainer_Tests() + { + - // } - //} + } + } } From 8bfcf975df5ca6b2f87e4805e36d11352730cf4d Mon Sep 17 00:00:00 2001 From: "nuck.tang" Date: Fri, 10 Jul 2020 11:09:31 +0800 Subject: [PATCH 15/20] remove MinioBlobContainer_Tests code --- .../BlobStoring/Minio/MinioBlobContainer_Tests.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobContainer_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobContainer_Tests.cs index fe41807a72..718766e9a5 100644 --- a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobContainer_Tests.cs +++ b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobContainer_Tests.cs @@ -7,13 +7,13 @@ namespace Volo.Abp.BlobStoring.Minio ////Please set the correct connection string in secrets.json and continue the test. - public class MinioBlobContainer_Tests : BlobContainer_Tests - { - public MinioBlobContainer_Tests() - { + //public class MinioBlobContainer_Tests : BlobContainer_Tests + //{ + // public MinioBlobContainer_Tests() + // { - } - } + // } + //} } From 18b69b71abd85c917f0df56210ffe8b251ccc84b Mon Sep 17 00:00:00 2001 From: "nuck.tang" Date: Tue, 14 Jul 2020 11:08:20 +0800 Subject: [PATCH 16/20] Code optimization --- .gitignore | 8 +++ .../BlobStoring/Minio/MinioBlobProvider.cs | 49 +++++++++---------- .../Minio/MinioBlobProviderConfiguration.cs | 4 +- .../Minio/AbpBlobStoringMinioTestModule.cs | 3 +- .../Minio/MinioBlobContainer_Tests.cs | 23 ++++----- .../Minio/MinioBlobNameCalculator_Tests.cs | 1 - 6 files changed, 42 insertions(+), 46 deletions(-) diff --git a/.gitignore b/.gitignore index 1f14485237..2058b364a5 100644 --- a/.gitignore +++ b/.gitignore @@ -304,3 +304,11 @@ modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Logs/ /templates/app/angular/package-lock.json /modules/client-simulation/demo/Volo.ClientSimulation.Demo/package-lock.json +/framework/src/Volo.Abp.AspNetCore/Properties/launchSettings.json +/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Properties/launchSettings.json +/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Properties/launchSettings.json +/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Properties/launchSettings.json +/framework/src/Volo.Abp.AspNetCore.Serilog/Properties/launchSettings.json +/framework/src/Volo.Abp.AspNetCore.SignalR/Properties/launchSettings.json +/framework/src/Volo.Abp.AspNetCore.TestBase/Properties/launchSettings.json +/framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Properties/launchSettings.json diff --git a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs index 5ecdfea5d4..54824b4ac4 100644 --- a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs @@ -2,7 +2,6 @@ using Minio.Exceptions; using System; using System.IO; -using System.Net; using System.Threading.Tasks; using Volo.Abp.DependencyInjection; @@ -66,30 +65,28 @@ namespace Volo.Abp.BlobStoring.Minio var blobName = MinioBlobNameCalculator.Calculate(args); var client = GetMinioClient(args); var containerName = GetContainerName(args); + if (!await BlobExistsAsync(client, containerName, blobName)) { return null; } var memoryStream = new MemoryStream(); - await client.GetObjectAsync(containerName, blobName, - (stream) => - { - if (stream != null) - { - stream.CopyTo(memoryStream); - } - else - { - memoryStream = null; - } - }); + await client.GetObjectAsync(containerName, blobName, stream => + { + if (stream != null) + { + stream.CopyTo(memoryStream); + } + else + { + memoryStream = null; + } + }); return memoryStream; - } - private MinioClient GetMinioClient(BlobProviderArgs args) { var configuration = args.Configuration.GetMinioConfiguration(); @@ -101,18 +98,14 @@ namespace Volo.Abp.BlobStoring.Minio } return client; - } - - protected virtual async Task CreateBucketIfNotExists(MinioClient client,string containerName) { if (!await client.BucketExistsAsync(containerName)) { await client.MakeBucketAsync(containerName); } - } private async Task BlobExistsAsync(MinioClient client, string containerName , string blobName) @@ -127,22 +120,25 @@ namespace Volo.Abp.BlobStoring.Minio // else it means that the object exists. // Execution is successful. await client.StatObjectAsync(containerName, blobName); - return true; } - catch (MinioException ex) - { - if(ex is ObjectNotFoundException) + catch (Exception e) + { + if (e is ObjectNotFoundException) { return false; } - - throw ex; + else + { + throw e; + } } + + return true; } return false; - } + private static string GetContainerName(BlobProviderArgs args) { var configuration = args.Configuration.GetMinioConfiguration(); @@ -152,6 +148,5 @@ namespace Volo.Abp.BlobStoring.Minio ? args.ContainerName.ToLower() : configuration.BucketName.ToLower(); } - } } diff --git a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProviderConfiguration.cs b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProviderConfiguration.cs index 03e951a984..63b0132d20 100644 --- a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProviderConfiguration.cs +++ b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProviderConfiguration.cs @@ -42,9 +42,7 @@ { get => _containerConfiguration.GetConfigurationOrDefault(MinioBlobProviderConfigurationNames.WithSSL, false); set => _containerConfiguration.SetConfiguration(MinioBlobProviderConfigurationNames.WithSSL, value); - } - - + } /// ///Default value: false. diff --git a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/AbpBlobStoringMinioTestModule.cs b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/AbpBlobStoringMinioTestModule.cs index cfe7b5b4cf..a65222c8c9 100644 --- a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/AbpBlobStoringMinioTestModule.cs +++ b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/AbpBlobStoringMinioTestModule.cs @@ -28,7 +28,6 @@ namespace Volo.Abp.BlobStoring.Minio private string _accessKey; private string _secretKey; - private readonly string _randomContainerName = "abp-minio-test-container-" + Guid.NewGuid().ToString("N"); public override void ConfigureServices(ServiceConfigurationContext context) @@ -70,7 +69,7 @@ namespace Volo.Abp.BlobStoring.Minio IDisposable subscription = observables.Subscribe( async item => await minioClient.RemoveObjectAsync(_randomContainerName, item.Key), async () => await minioClient.RemoveBucketAsync(_randomContainerName) - ); + ); } diff --git a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobContainer_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobContainer_Tests.cs index 718766e9a5..a9c2776714 100644 --- a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobContainer_Tests.cs +++ b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobContainer_Tests.cs @@ -1,19 +1,16 @@ -using Shouldly; -using System.Threading.Tasks; -using Xunit; +using Xunit; namespace Volo.Abp.BlobStoring.Minio { + /* + //Please set the correct connection string in secrets.json and continue the test. - ////Please set the correct connection string in secrets.json and continue the test. - - //public class MinioBlobContainer_Tests : BlobContainer_Tests - //{ - // public MinioBlobContainer_Tests() - // { - - - // } - //} + public class MinioBlobContainer_Tests : BlobContainer_Tests + { + public MinioBlobContainer_Tests() + { + } + } + */ } diff --git a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobNameCalculator_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobNameCalculator_Tests.cs index 712c849965..9d1954efc3 100644 --- a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobNameCalculator_Tests.cs +++ b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobNameCalculator_Tests.cs @@ -10,7 +10,6 @@ namespace Volo.Abp.BlobStoring.Minio private readonly IMinioBlobNameCalculator _calculator; private readonly ICurrentTenant _currentTenant; - private const string MinioContainerName = "/"; private const string MinioSeparator = "/"; public MinioBlobNameCalculator_Tests() From a547c6b0384e6f4fd44bc8d37ccb4608fa26182c Mon Sep 17 00:00:00 2001 From: "nuck.tang" Date: Wed, 15 Jul 2020 10:10:57 +0800 Subject: [PATCH 17/20] Add MinioBlobNamingNormalizer --- .gitignore | 8 --- .../Minio/MinioBlobNamingNormalizer.cs | 52 +++++++++++++++++ .../BlobStoring/Minio/MinioBlobProvider.cs | 17 ++---- .../Minio/AbpBlobStoringMinioTestModule.cs | 18 +++--- ...MinioBlobNamingNormalizerProvider_Tests.cs | 57 +++++++++++++++++++ .../Minio/MinioBlobContainer_Tests.cs | 5 +- 6 files changed, 127 insertions(+), 30 deletions(-) create mode 100644 framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobNamingNormalizer.cs create mode 100644 framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/DefaultMinioBlobNamingNormalizerProvider_Tests.cs diff --git a/.gitignore b/.gitignore index 2058b364a5..1f14485237 100644 --- a/.gitignore +++ b/.gitignore @@ -304,11 +304,3 @@ modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Logs/ /templates/app/angular/package-lock.json /modules/client-simulation/demo/Volo.ClientSimulation.Demo/package-lock.json -/framework/src/Volo.Abp.AspNetCore/Properties/launchSettings.json -/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Properties/launchSettings.json -/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Properties/launchSettings.json -/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Properties/launchSettings.json -/framework/src/Volo.Abp.AspNetCore.Serilog/Properties/launchSettings.json -/framework/src/Volo.Abp.AspNetCore.SignalR/Properties/launchSettings.json -/framework/src/Volo.Abp.AspNetCore.TestBase/Properties/launchSettings.json -/framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Properties/launchSettings.json diff --git a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobNamingNormalizer.cs b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobNamingNormalizer.cs new file mode 100644 index 0000000000..d350910105 --- /dev/null +++ b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobNamingNormalizer.cs @@ -0,0 +1,52 @@ +using System.Text.RegularExpressions; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.BlobStoring.Minio +{ + public class MinioBlobNamingNormalizer : IBlobNamingNormalizer, ITransientDependency + { + /// + ///https://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html + /// + public virtual string NormalizeContainerName(string containerName) + { + // All letters in a container name must be lowercase. + containerName = containerName.ToLower(); + + // Container names can contain only letters, numbers, and the dash (-) character. + containerName = Regex.Replace(containerName, "[^a-z0-9-]", string.Empty); + + // Every dash (-) character must be immediately preceded and followed by a letter or number; + // consecutive dashes are not permitted in container names. + // Container names must start or end with a letter or number + containerName = Regex.Replace(containerName, "-{2,}", "-"); + containerName = Regex.Replace(containerName, "^-", string.Empty); + containerName = Regex.Replace(containerName, "-$", string.Empty); + + // Container names must be from 3 through 63 characters long. + if (containerName.Length < 3) + { + var length = containerName.Length; + for (var i = 0; i < 3 - length; i++) + { + containerName += "0"; + } + } + + if (containerName.Length > 63) + { + containerName = containerName.Substring(0, 63); + } + + return containerName; + } + + /// + /// https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html + /// + public virtual string NormalizeBlobName(string blobName) + { + return blobName; + } + } +} diff --git a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs index 54824b4ac4..2d1585542c 100644 --- a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs @@ -115,10 +115,6 @@ namespace Volo.Abp.BlobStoring.Minio { try { - // Check whether the object exists using statObject(). - // If the object is not found, statObject() throws an exception, - // else it means that the object exists. - // Execution is successful. await client.StatObjectAsync(containerName, blobName); } catch (Exception e) @@ -126,11 +122,9 @@ namespace Volo.Abp.BlobStoring.Minio if (e is ObjectNotFoundException) { return false; - } - else - { - throw e; - } + } + + throw; } return true; @@ -143,10 +137,9 @@ namespace Volo.Abp.BlobStoring.Minio { var configuration = args.Configuration.GetMinioConfiguration(); - //Minio bucket name must be lowercase return configuration.BucketName.IsNullOrWhiteSpace() - ? args.ContainerName.ToLower() - : configuration.BucketName.ToLower(); + ? args.ContainerName + : configuration.BucketName; } } } diff --git a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/AbpBlobStoringMinioTestModule.cs b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/AbpBlobStoringMinioTestModule.cs index a65222c8c9..71d780e880 100644 --- a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/AbpBlobStoringMinioTestModule.cs +++ b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/AbpBlobStoringMinioTestModule.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Reactive.Linq; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Minio; @@ -59,18 +60,19 @@ namespace Volo.Abp.BlobStoring.Minio }); } - public async override void OnApplicationShutdown(ApplicationShutdownContext context) + public override async void OnApplicationShutdown(ApplicationShutdownContext context) { var minioClient = new MinioClient(_endPoint, _accessKey, _secretKey); if (await minioClient.BucketExistsAsync(_randomContainerName)) { - var observables =minioClient.ListObjectsAsync(_randomContainerName,null,true); - var objectNames = new List(); - IDisposable subscription = observables.Subscribe( - async item => await minioClient.RemoveObjectAsync(_randomContainerName, item.Key), - async () => await minioClient.RemoveBucketAsync(_randomContainerName) - ); - + var objects = await minioClient.ListObjectsAsync(_randomContainerName, null, true).ToList(); + + foreach (var item in objects) + { + await minioClient.RemoveObjectAsync(_randomContainerName, item.Key); + } + + await minioClient.RemoveBucketAsync(_randomContainerName); } } diff --git a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/DefaultMinioBlobNamingNormalizerProvider_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/DefaultMinioBlobNamingNormalizerProvider_Tests.cs new file mode 100644 index 0000000000..ae7c4fab75 --- /dev/null +++ b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/DefaultMinioBlobNamingNormalizerProvider_Tests.cs @@ -0,0 +1,57 @@ +using Shouldly; +using Xunit; + +namespace Volo.Abp.BlobStoring.Minio +{ + public class DefaultMinioBlobNamingNormalizerProvider_Tests : AbpBlobStoringMinioTestCommonBase + { + private readonly IBlobNamingNormalizer _blobNamingNormalizer; + + public DefaultMinioBlobNamingNormalizerProvider_Tests() + { + _blobNamingNormalizer = GetRequiredService(); + } + + [Fact] + public void NormalizeContainerName_Lowercase() + { + var filename = "ThisIsMyContainerName"; + filename = _blobNamingNormalizer.NormalizeContainerName(filename); + filename.ShouldBe("thisismycontainername"); + } + + [Fact] + public void NormalizeContainerName_Only_Letters_Numbers_Dash() + { + var filename = ",./this-i,./s-my-c,./ont,./ai+*/.=!@#$n^&*er-name.+/"; + filename = _blobNamingNormalizer.NormalizeContainerName(filename); + filename.ShouldBe("this-is-my-container-name"); + } + + [Fact] + public void NormalizeContainerName_Dash() + { + var filename = "-this--is----my-container----name-"; + filename = _blobNamingNormalizer.NormalizeContainerName(filename); + filename.ShouldBe("this-is-my-container-name"); + } + + + [Fact] + public void NormalizeContainerName_Min_Length() + { + var filename = "a"; + filename = _blobNamingNormalizer.NormalizeContainerName(filename); + filename.Length.ShouldBeGreaterThanOrEqualTo(3); + } + + + [Fact] + public void NormalizeContainerName_Max_Length() + { + var filename = "abpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabp"; + filename = _blobNamingNormalizer.NormalizeContainerName(filename); + filename.Length.ShouldBeLessThanOrEqualTo(63); + } + } +} diff --git a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobContainer_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobContainer_Tests.cs index a9c2776714..8ee92274ad 100644 --- a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobContainer_Tests.cs +++ b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobContainer_Tests.cs @@ -2,7 +2,7 @@ namespace Volo.Abp.BlobStoring.Minio { - /* + //Please set the correct connection string in secrets.json and continue the test. public class MinioBlobContainer_Tests : BlobContainer_Tests @@ -10,7 +10,8 @@ namespace Volo.Abp.BlobStoring.Minio public MinioBlobContainer_Tests() { + } } - */ + } From 37453bf0788fa29dd5d22253825a3805e314b670 Mon Sep 17 00:00:00 2001 From: "nuck.tang" Date: Wed, 15 Jul 2020 10:30:45 +0800 Subject: [PATCH 18/20] Hiding MinioBlobContainer_Tests code --- .../Volo/Abp/BlobStoring/Minio/MinioBlobContainer_Tests.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobContainer_Tests.cs b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobContainer_Tests.cs index 8ee92274ad..1da4b6b9d7 100644 --- a/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobContainer_Tests.cs +++ b/framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobContainer_Tests.cs @@ -2,9 +2,8 @@ namespace Volo.Abp.BlobStoring.Minio { - + /* //Please set the correct connection string in secrets.json and continue the test. - public class MinioBlobContainer_Tests : BlobContainer_Tests { public MinioBlobContainer_Tests() @@ -13,5 +12,5 @@ namespace Volo.Abp.BlobStoring.Minio } } - + */ } From 897d4d556a2f841953f5e63597aaea23a0edc840 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 15 Jul 2020 22:39:14 +0800 Subject: [PATCH 19/20] Change GetMinioClient method access modifiers to protected virtual --- .../Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs index 2d1585542c..142363d14e 100644 --- a/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs @@ -87,7 +87,7 @@ namespace Volo.Abp.BlobStoring.Minio return memoryStream; } - private MinioClient GetMinioClient(BlobProviderArgs args) + protected virtual MinioClient GetMinioClient(BlobProviderArgs args) { var configuration = args.Configuration.GetMinioConfiguration(); var client = new MinioClient(configuration.EndPoint, configuration.AccessKey, configuration.SecretKey); From 0209a44ba1307690d40ea39f22514611406a4072 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 15 Jul 2020 22:41:15 +0800 Subject: [PATCH 20/20] Update common.ps1 --- nupkg/common.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/nupkg/common.ps1 b/nupkg/common.ps1 index 0d20f447d9..68876a03b8 100644 --- a/nupkg/common.ps1 +++ b/nupkg/common.ps1 @@ -59,6 +59,7 @@ $projects = ( "framework/src/Volo.Abp.BlobStoring", "framework/src/Volo.Abp.BlobStoring.FileSystem", "framework/src/Volo.Abp.BlobStoring.Azure", + "framework/src/Volo.Abp.BlobStoring.Minio", "framework/src/Volo.Abp.Caching", "framework/src/Volo.Abp.Caching.StackExchangeRedis", "framework/src/Volo.Abp.Castle.Core",