ASP.Net core 3.0 (3.1) 为单页应用设置PathBase

ASP.Net core 3.0 (3.1) set PathBase for single page application

我配置了以下 asp.net 核心 spa 应用程序(react-redux 模板)

        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 上它完美地工作。自动修改 index.html 并将所有静态文件移至相对路径。但是在 3.0 (3.1) 上静态+生成的文件放在根目录下。

Generated files on .Net Core 2.2

Generated files on .Net Core 3.0

有没有人有解决的办法?或者可能是 Startup.cs 的一些示例,其中包含有效的 pathBase?

  1. 通常使用app.UsePathBase(new PathString("/foo"));因为反向代理切断了一些前缀导致ASP.NET核心应用没有意识到虚拟应用路径以[=12开始=].在您的场景中,如果您没有将前缀重写为空字符串的反向代理,则不需要 app.UsePathBase(...)

  2. 相反,如果您的 spa 在子路径上运行,您可以设置一个中间件来分支 /foo

  3. 最后,您可能想在 package.json 中添加一个 属性 of homepage,这样它会在发布时生成 <base url="/foo/"/>。或者,您可以手动更新 ClientApp/public/index.html 中的 <base url="">

简而言之,在您的 package.json

中添加一个 "homepage": "/foo/"
  "private": true,
  "homepage": "/foo/",
  "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")) 除非你明白你确实想要覆盖所有路由的路径基础。