Получить список областей в ядре asp net для staticFiles middleware - PullRequest
0 голосов
/ 06 июля 2019

Я использую dotnet core mvc (v3.0 preview) и использую области для разделения в основном независимых страниц приложения. Я хотел бы, чтобы мои файлы .js и .css также сохранялись в папке областей, поэтому в моем 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"},
                    })
            });

Это позволяет (требует), чтобы я имел js в папках Areas/Intro/wwwarearoot/ и Areas/Todo/wwwarearoot/ и импортировал javascript и css под префиксом ~/areas/.

Мой вопрос о том, как улучшить вторую строку, чтобы я фактически получал области приложения вместо статического списка.

1 Ответ

0 голосов
/ 07 июля 2019

Так как я не смог найти код, когда искал эту проблему, вот полный код, которым я закончил:

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
    ...
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...