Как использовать weboptimizer для работы с несколькими виртуальными каталогами и одним корневым каталогом www

#asp.net-mvc #asp.net-core #asp.net-core-mvc #.net-5 #web-optimization

Вопрос:

ASP.NET 5 Основное приложение MVC обслуживает несколько сайтов с помощью вебоптимизатора LigerShark ( https://github.com/ligershark/WebOptimizer )

 https://example.com/store1
https://example.com/store2

 

Все эти сайты должны обслуживаться из каталога wwwroot, содержащего одинаковые файлы для этих URL-адресов.
Сайты определены в файле hosts.json:

 {
  "EevaHosts": {
    "example.com/store1": {}
    "example.com/store2": {}
    "example2.com": {}
  }
}
 

Я попробовал приведенный ниже код, чтобы заставить WebOptimizer использовать один и тот же каталог wwwwroot для каждого сайта в Debian Linux, но получил исключение для https://example.com/store1/site.js

Не найдено подходящих файлов «/store1/js/site.js» существует в «/var/www/appbasedir/wwwroot/»

Как заставить веб-оптимизатор использовать один и тот же каталог wwwwroot для всех сайтов ? Если промежуточное программное обеспечение Weboptimizer удалено, статические файлы будут правильно размещены на сервере.

В StartUp.cs:

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{ ...

    var eevakonf = new ConfigurationBuilder().AddJsonFile("hosts.json").Build();

    foreach (var host1 in eevakonf.GetSection("EevaHosts").GetChildren())
    {
        if (!host1.Key.Contains("/"))
            app.UseWebOptimizer();
        else
            app.UseWebOptimizer(env, new FileProviderOptions[] { new FileProviderOptions()
            {
                // example.com/store1 -> /store1
                RequestPath = new PathString(RequestPathExtract(host1)),
                FileProvider = env.WebRootFileProvider
            }
            });
    }

    // Using single call causes the same exception:
    //HashSet<FileProviderOptions> fp = new();
    //foreach (var host1 in eevakonf.GetSection("EevaHosts").GetChildren())
    //{
    //    if (host1.Key.Contains("/"))
    //        fp.Add(new FileProviderOptions() {
    //            RequestPath = new PathString(RequestPathExtract(host1)) ,
    //            FileProvider = env.WebRootFileProvider
    //        });
    //}
    //app.UseWebOptimizer(env, fp.ToArray());

    foreach (var host in eevakonf.GetSection("EevaHosts").GetChildren())
    {
        if (!host.Key.Contains("/"))
            app.UseStaticFiles();
        else
        {
            app.UseStaticFiles(new StaticFileOptions
            {
                RequestPath = new PathString(RequestPathExtract(host))
            });
        }
    }
  }


    static string RequestPathExtract(IConfigurationSection host)
    {
        return "/"   StrExtract(host.Key, "/");
    }

 static string StrExtract(string cSearchExpression, string cBeginDelim)
{
    int nbpos = At(cBeginDelim, cSearchExpression);
    return cSearchExpression[(nbpos   cBeginDelim.Length - 1)..];
}
 

Комментарии:

1. Не уверен, что это имеет отношение к делу. Но webOptimizer не поддерживает .net core 5.0. Для меня это другая проблема, но я заметил это при создании пиплайнов azure.

2. github.com/ligershark/WebOptimizer является промежуточным программным обеспечением .NET Core. Он разработан для .NET Core и работает в .NET 5