From be5406a5d0f7ffce230a44947b91a6c85752b1d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 10 Sep 2019 19:10:08 +0300 Subject: [PATCH] Fixed virtual file static file middleware compatibility issue for asp.net core 3.0 --- ...rtualFileLocalizationResourceContributorBase.cs | 2 +- .../FileProviders/AbpFileInfoExtensions.cs | 13 +++++++++++++ .../DictionaryBasedFileProvider.cs | 5 +++-- .../Abp/VirtualFileSystem/DynamicFileProvider.cs | 5 +++-- .../Embedded/EmbeddedResourceFileInfo.cs | 12 +++++++----- .../Abp/VirtualFileSystem/VirtualFileProvider.cs | 12 ------------ .../Volo.Abp.AspNetCore.Tests.csproj | 3 +++ .../Volo/Abp/AspNetCore/AbpAspNetCoreTestModule.cs | 2 +- .../VirtualFileSystem/VirtualFileProvider_Tests.cs | 14 ++++++++++++++ 9 files changed, 45 insertions(+), 23 deletions(-) diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/VirtualFiles/VirtualFileLocalizationResourceContributorBase.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/VirtualFiles/VirtualFileLocalizationResourceContributorBase.cs index aa66507cdd..c42036d1cd 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/VirtualFiles/VirtualFileLocalizationResourceContributorBase.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/VirtualFiles/VirtualFileLocalizationResourceContributorBase.cs @@ -84,7 +84,7 @@ namespace Volo.Abp.Localization.VirtualFiles var dictionary = CreateDictionaryFromFile(file); if (dictionaries.ContainsKey(dictionary.CultureName)) { - throw new AbpException($"{file.PhysicalPath} dictionary has a culture name '{dictionary.CultureName}' which is already defined!"); + throw new AbpException($"{file.GetVirtualOrPhysicalPathOrNull()} dictionary has a culture name '{dictionary.CultureName}' which is already defined!"); } dictionaries[dictionary.CultureName] = dictionary; diff --git a/framework/src/Volo.Abp.VirtualFileSystem/Microsoft/Extensions/FileProviders/AbpFileInfoExtensions.cs b/framework/src/Volo.Abp.VirtualFileSystem/Microsoft/Extensions/FileProviders/AbpFileInfoExtensions.cs index 6217e82805..5bc9402655 100644 --- a/framework/src/Volo.Abp.VirtualFileSystem/Microsoft/Extensions/FileProviders/AbpFileInfoExtensions.cs +++ b/framework/src/Volo.Abp.VirtualFileSystem/Microsoft/Extensions/FileProviders/AbpFileInfoExtensions.cs @@ -3,6 +3,7 @@ using System.IO; using System.Text; using System.Threading.Tasks; using Volo.Abp; +using Volo.Abp.VirtualFileSystem.Embedded; namespace Microsoft.Extensions.FileProviders { @@ -57,5 +58,17 @@ namespace Microsoft.Extensions.FileProviders return await stream.GetAllBytesAsync(); } } + + public static string GetVirtualOrPhysicalPathOrNull([NotNull] this IFileInfo fileInfo) + { + Check.NotNull(fileInfo, nameof(fileInfo)); + + if (fileInfo is EmbeddedResourceFileInfo embeddedFileInfo) + { + return embeddedFileInfo.VirtualPath; + } + + return fileInfo.PhysicalPath; + } } } diff --git a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/DictionaryBasedFileProvider.cs b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/DictionaryBasedFileProvider.cs index 4fc72c07ec..a8ea963f0e 100644 --- a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/DictionaryBasedFileProvider.cs +++ b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/DictionaryBasedFileProvider.cs @@ -39,12 +39,13 @@ namespace Volo.Abp.VirtualFileSystem var directoryPath = subpath.EnsureEndsWith('/'); foreach (var fileInfo in Files.Values) { - if (!fileInfo.PhysicalPath.StartsWith(directoryPath)) + var fullPath = fileInfo.GetVirtualOrPhysicalPathOrNull(); + if (!fullPath.StartsWith(directoryPath)) { continue; } - var relativePath = fileInfo.PhysicalPath.Substring(directoryPath.Length); + var relativePath = fullPath.Substring(directoryPath.Length); if (relativePath.Contains("/")) { continue; diff --git a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/DynamicFileProvider.cs b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/DynamicFileProvider.cs index a270616e3a..0a92f62f0a 100644 --- a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/DynamicFileProvider.cs +++ b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/DynamicFileProvider.cs @@ -31,8 +31,9 @@ namespace Volo.Abp.VirtualFileSystem public void AddOrUpdate(IFileInfo fileInfo) { - DynamicFiles.AddOrUpdate(fileInfo.PhysicalPath, fileInfo, (key, value) => fileInfo); - ReportChange(fileInfo.PhysicalPath); + var filePath = fileInfo.GetVirtualOrPhysicalPathOrNull(); + DynamicFiles.AddOrUpdate(filePath, fileInfo, (key, value) => fileInfo); + ReportChange(filePath); } public bool Delete(string filePath) diff --git a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/EmbeddedResourceFileInfo.cs b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/EmbeddedResourceFileInfo.cs index 22df03f2ab..7291f93cf8 100644 --- a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/EmbeddedResourceFileInfo.cs +++ b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/EmbeddedResourceFileInfo.cs @@ -29,7 +29,9 @@ namespace Volo.Abp.VirtualFileSystem.Embedded } private long? _length; - public string PhysicalPath { get; } + public string PhysicalPath => null; + + public string VirtualPath { get; } public string Name { get; } @@ -46,14 +48,14 @@ namespace Volo.Abp.VirtualFileSystem.Embedded public EmbeddedResourceFileInfo( Assembly assembly, string resourcePath, - string physicalPath, + string virtualPath, string name, DateTimeOffset lastModified) { _assembly = assembly; _resourcePath = resourcePath; - PhysicalPath = physicalPath; + VirtualPath = virtualPath; Name = name; LastModified = lastModified; } @@ -63,7 +65,7 @@ namespace Volo.Abp.VirtualFileSystem.Embedded { var stream = _assembly.GetManifestResourceStream(_resourcePath); - if (!_length.HasValue) + if (!_length.HasValue && stream != null) { _length = stream.Length; } @@ -73,7 +75,7 @@ namespace Volo.Abp.VirtualFileSystem.Embedded public override string ToString() { - return $"[EmbeddedResourceFileInfo] {Name} ({PhysicalPath})"; + return $"[EmbeddedResourceFileInfo] {Name} ({this.VirtualPath})"; } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileProvider.cs b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileProvider.cs index d2f27006da..be08fc2024 100644 --- a/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileProvider.cs +++ b/framework/src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileProvider.cs @@ -72,18 +72,6 @@ namespace Volo.Abp.VirtualFileSystem ); } - public override IFileInfo GetFileInfo(string subpath) - { - var result = base.GetFileInfo(subpath); - return result; - } - - public override IDirectoryContents GetDirectoryContents(string subpath) - { - var result = base.GetDirectoryContents(subpath); - return result; - } - private Dictionary CreateFiles() { var files = new Dictionary(StringComparer.OrdinalIgnoreCase); diff --git a/framework/test/Volo.Abp.AspNetCore.Tests/Volo.Abp.AspNetCore.Tests.csproj b/framework/test/Volo.Abp.AspNetCore.Tests/Volo.Abp.AspNetCore.Tests.csproj index 983e8fcb39..061e1640ce 100644 --- a/framework/test/Volo.Abp.AspNetCore.Tests/Volo.Abp.AspNetCore.Tests.csproj +++ b/framework/test/Volo.Abp.AspNetCore.Tests/Volo.Abp.AspNetCore.Tests.csproj @@ -10,6 +10,9 @@ false false false + true + false + true diff --git a/framework/test/Volo.Abp.AspNetCore.Tests/Volo/Abp/AspNetCore/AbpAspNetCoreTestModule.cs b/framework/test/Volo.Abp.AspNetCore.Tests/Volo/Abp/AspNetCore/AbpAspNetCoreTestModule.cs index 2941afa087..04b21b00f4 100644 --- a/framework/test/Volo.Abp.AspNetCore.Tests/Volo/Abp/AspNetCore/AbpAspNetCoreTestModule.cs +++ b/framework/test/Volo.Abp.AspNetCore.Tests/Volo/Abp/AspNetCore/AbpAspNetCoreTestModule.cs @@ -20,7 +20,7 @@ namespace Volo.Abp.AspNetCore public override void ConfigureServices(ServiceConfigurationContext context) { var hostingEnvironment = context.Services.GetHostingEnvironment(); - + Configure(options => { options.FileSets.AddEmbedded(); diff --git a/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/VirtualFileProvider_Tests.cs b/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/VirtualFileProvider_Tests.cs index 2c853e3a19..e376d24aa0 100644 --- a/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/VirtualFileProvider_Tests.cs +++ b/framework/test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/VirtualFileProvider_Tests.cs @@ -1,4 +1,5 @@ using System.IO; +using System.Linq; using System.Text; using Microsoft.Extensions.DependencyInjection; using Shouldly; @@ -32,6 +33,19 @@ namespace Volo.Abp.VirtualFileSystem } } + [Fact] + public void Should_Define_And_Get_Embedded_Directory_Contents() + { + //Act + var contents = _virtualFileProvider.GetDirectoryContents("/js"); + + //Assert + contents.Exists.ShouldNotBeNull(); + + var contentList = contents.ToList(); + contentList.ShouldContain(x => x.Name == "jquery-3-1-1-min.js"); + } + [DependsOn(typeof(AbpVirtualFileSystemModule))] public class TestModule : AbpModule {