【问题标题】:ASP.Net core 3.0 (3.1) set PathBase for single page applicationASP.Net core 3.0(3.1)为单页应用设置PathBase
【发布时间】:2020-02-12 13:21:02
【问题描述】:

我配置了以下 asp.net core 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

有没有人有解决这个问题的想法?或者可能是一些带有工作 pathBase 的 Startup.cs 示例?

【问题讨论】:

  • 能否请您与我们分享一个可复制的演示?
  • 是的,当然! Here my project。我尝试了一些描述here的方法。但仍然没有解决办法。我找不到任何修改 index.html 的代码和任何 webpack 配置来确定它如何生成静态文件。

标签: asp.net-core routing single-page-application


【解决方案1】:
  1. 通常使用app.UsePathBase(new PathString("/foo"));,因为反向代理切断了一些前缀,导致 ASP.NET Core 应用程序没有意识到虚拟应用程序路径以/foo 开头。在您的场景中,如果您没有将前缀重写为空字符串的反向代理,则不需要app.UsePathBase(...)

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

  3. 最后,您可能希望在package.json 中添加homepage 的属性,以便在发布时生成<base url="/foo/"/>。或者,您可以手动更新ClientApp/public/index.html 中的<base url="">

简而言之,在您的package.json 中添加一个"homepage": "/foo/"

“私人”:真的, “主页”:“/foo/”, “依赖”:{ ... }

并设置一个/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")),除非你明白你确实想要覆盖所有路由的路径基础。

【讨论】:

  • 还是不行。 Webpack 再次在 root 中生成静态文件,或者如果我映射了某个路径 app.Map(spaPath,appBuilder...,则找不到任何东西。图片在这里-i.stack.imgur.com/0DTbQ.png。我更新了我的project,请问您可以查看代码吗?或者举一个在子路径上运行的应用程序的例子?非常感谢
  • 现在发现,如果 URL 以 / 结尾,则会自动生成 index.html,但仍然没有任何方法可以将 static/js 文件夹和 manifest.json 移动到相对路径。 i.stack.imgur.com/xSVGj.png
  • 有效!!!但仅限于已发布的项目。如果我通过 VS 启动它,它会导致我之前描述的错误。还有一点:如果我想从某个配置中设置相对路径,在 package.json 中必须是 "homepage": "."
猜你喜欢
  • 2021-01-15
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
相关资源
最近更新 更多