ASP.NET核心中间件MVC / React MapSpaFallbackRoute

时间:2018-12-03 12:31:39

标签: reactjs asp.net-core-mvc middleware

我尝试设置一个使用SPA来为我的管理区域提供应用程序的React部分和MVC的.NET Core WebApplication。

React应用程序位于“ /” MVC部分应位于“ / admin”

我已经按照以下步骤设置了中间件:

// Standard routing
        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseSpaStaticFiles();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "admin/{controller=Home}/{action=Index}/{id?}");
        });

        // Fallback Route for /admin and /api
        app.MapWhen(x => x.Request.Path.Value.ToLower().StartsWith("/admin") || x.Request.Path.Value.ToLower().StartsWith("/api"), builder =>
        {
            builder.UseMvc(routes =>
            {
                routes.MapSpaFallbackRoute(
                    name: "spa-fallback",
                    defaults: new { controller = "Home", action = "Index" });
            });
        });

        // use SPA for other requests
        app.MapWhen(x => !(x.Request.Path.Value.ToLower().StartsWith("/admin") || x.Request.Path.Value.ToLower().StartsWith("/api")), builder =>
        {
            builder.UseSpa(spa =>
            {
                spa.Options.SourcePath = "ClientApp";

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

这在我的机器上的开发模式(使用ReactDevelopmentServer)中按预期工作。

当我发布并发布它时,所有请求都被路由到React(SPA)应用程序,因此无法访问/ admin MVC部分。

我的设置有什么问题?我将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:1)

天哪!

我发现了问题。它与Visual Studio创建的Boilerplate React Code有关:它使用一个名为registerServiceWorker.js的文件,这简直是罪恶!它使用该死的粘性浏览器缓存,使所有内容几乎都是静态的。

Visual Studio模板的.net部分是正确的,您可以只使用标准的中间件设置,所有非Spa请求都将按预期的方式路由:

// Standard routing
        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseSpaStaticFiles();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "admin/{controller=Home}/{action=Index}/{id?}");
        });

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

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