ASP. Net core 3.0 (3.1) установить PathBase для одностраничного приложения - PullRequest
0 голосов
/ 12 февраля 2020

У меня настроено следующее asp. net базовое приложение spa (шаблон реагировать на избыточность)

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UsePathBase(new PathString("/foo"));

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
            }

            app.UseStaticFiles();
            app.UseSpaStaticFiles();

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller}/{action=Index}/{id?}");
            });

            app.UseSpa(spa =>
            {
                spa.Options.SourcePath = "ClientApp";

                if (env.IsDevelopment())
                {
                    spa.UseReactDevelopmentServer(npmScript: "start");
                }
            });
        } 

Я бы хотел установить pathBase для приложения, но app.UsePathBase(new PathString("/foo")) просто игнорируется. На 2.2 это отлично сработало. Автоматически измененный индекс. html и все файлы stati c были перемещены по относительному пути. Но на 3.0 (3.1) stati c + сгенерированные файлы помещаются на root.

Сгенерированные файлы на. Net Core 2.2

Сгенерированные файлы на. Net Core 3.0

У кого-нибудь есть идеи по ее решению? Или может быть несколько примеров Startup.cs с рабочим pathBase?

1 Ответ

1 голос
/ 14 февраля 2020
  1. Обычно используется app.UsePathBase(new PathString("/foo"));, поскольку обратный прокси обрезает некоторый префикс и вызывает ASP. NET Базовое приложение не понимает, что путь виртуального приложения начинается с /foo. В вашем сценарии, если у вас нет обратного прокси-сервера, который переписывает префикс в пустую строку, вам не нужно app.UsePathBase(...).

  2. Вместо этого, если ваш спа-центр работает на подпути, вы можете установить промежуточное ПО, которое разветвляет /foo.

  3. Наконец, вы можете захотеть добавьте свойство homepage в ваш package.json, чтобы оно генерировало <base url="/foo/"/> при публикации. Или, в качестве альтернативы, вы можете обновить <base url=""> in ClientApp/public/index.html вручную.

Короче говоря, добавьте "homepage": "/foo/" в package.json

  "private": true,
  <b>"homepage": "/foo/",</b>
  "dependencies": {
      ...
   }

и настройте ветку /foo, чтобы запуск SPA выполнялся по этому пути:

string spaPath = "/foo";
app.Map(spaPath,appBuilder =>{
    appBuilder.UseSpa(spa =>
    {
        spa.Options.DefaultPage = spaPath+"/index.html";
        spa.Options.DefaultPageStaticFileOptions = new StaticFileOptions{
            RequestPath = spaPath,
        };
        spa.Options.SourcePath = "ClientApp";
        if (env.IsDevelopment())
        {
            spa.UseReactDevelopmentServer(npmScript: "start");
        }
    });
});

Не используйте app.UsePathBase(new PathString("/foo")), если не понимаете, что хотите переопределить базу путей для всех маршрутов.

...