我尝试设置一个使用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部分。
我的设置有什么问题?我将不胜感激。
谢谢!
答案 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");
}
});