簡體   English   中英

獲取ASP Net Core中staticFiles中間件的區域列表

[英]Get list of areas in asp net core for staticFiles middleware

我使用dotnet core mvc(v3.0預覽版)並使用區域來分隔應用程序的大部分獨立頁面。 我想將.js和.css文件也存儲在area文件夾中,因此我在Startup.cs提出了以下內容:

            app.UseStaticFiles();// wwwroot
            var areas = new string[]{"Intro", "Todo"};
            app.UseStaticFiles(new StaticFileOptions{
                FileProvider = new CompositeFileProvider( areas.Select( area =>
                    new PhysicalFileProvider(
                        Path.Combine(Directory.GetCurrentDirectory(),"Areas", area, "wwwarearoot"))
                    ).ToArray()),
                RequestPath = "/areas",
                ContentTypeProvider = new FileExtensionContentTypeProvider(
                    new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
                    {
                        { ".js", "application/javascript" },
                        { ".css", "text/css"},
                    })
            });

這允許(要求)我在文件夾Areas/Intro/wwwarearoot/Areas/Todo/wwwarearoot/包含js,並在~/areas/前綴下導入javascript和CSS。

我的問題是關於如何改進第二行,因此我實際上得到了應用程序領域,而不是擁有靜態列表。

由於搜索此問題時找不到代碼,因此這里是我最終得到的完整代碼。

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.StaticFiles;
using Microsoft.Extensions.FileProviders;

namespace MyNamespace.Utils{
    public static class AppExtensions{
        private static IEnumerable<string> _GetAreasWithAreaRoot(){
            var cd = Directory.GetCurrentDirectory();
            var directory = new DirectoryInfo(Path.Combine(cd, "Areas"));
            var areas = directory.EnumerateDirectories();
            foreach(var area in areas){
                var wwwarearoot = area.EnumerateDirectories("wwwarearoot").FirstOrDefault();
                if(wwwarearoot != null){
                    yield return wwwarearoot.FullName;
                }
            }
        }
        public static void UseAreaStaticFiles(this IApplicationBuilder app){
            var areas = _GetAreasWithAreaRoot();
            app.UseStaticFiles(new StaticFileOptions{
                FileProvider = new CompositeFileProvider( areas.Select( areawwwroot =>
                    new PhysicalFileProvider(areawwwroot)
                ).ToArray()),
                RequestPath = "/areas",
                ContentTypeProvider = new FileExtensionContentTypeProvider(
                    new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
                    {
                        { ".js", "application/javascript" },
                        { ".css", "text/css"}
                    })
            });
        }
    }
}

在我的Startup.cs我可以添加

using MyNamespace.Utils;
...
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    ...
    app.UseAreaStaticFiles(); // Areas/{area}/wwwarearoot
    ...
}

為確保wwwarearoot文件被包含在已發布的工件中,您可能還希望將以下內容添加到*.csproj文件中

<ItemGroup>
    ...
    <Content Include="Areas\*\wwwarearoot\**">
         <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    ...
</ItemGroup>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM