如何为 SpaServices 托管的多个 SPA 配置 ASP.net 核心服务器路由
How to configure ASP.net Core server routing for multiple SPAs hosted with SpaServices
我有一个 Angular 5 应用程序,我想使用 Angular Universal 在 ASP.net Core 上使用最新的 Angular template RC. I've followed the docs and have the application up and running. The problem is that I am also using Angular's i18n tools 托管它,它会生成多个已编译的应用程序,1每个语言环境。我需要能够主持 https://myhost.com/{locale}/
.
中的每一个
我知道我可以为每个语言环境启动 ASP.net 核心应用程序的一个实例,并在网络服务器中设置托管,以使用适当的路径路由到关联的应用程序,但这似乎过分了我.
路由配置为:
// app is an instance of Microsoft.AspNetCore.Builder.IApplicationBuilder
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller}/{action=Index}/{id?}");
});
SpaServices 配置为:
app.UseSpa(spa =>
{
// To learn more about options for serving an Angular SPA from ASP.NET Core,
// see https://go.microsoft.com/fwlink/?linkid=864501
spa.Options.SourcePath = "ClientApp";
spa.UseSpaPrerendering(options =>
{
options.BootModulePath = $"{spa.Options.SourcePath}/dist-server/main.bundle.js";
options.BootModuleBuilder = env.IsDevelopment()
? new AngularCliBuilder(npmScript: "build:ssr:en")
: null;
options.ExcludeUrls = new[] { "/sockjs-node" };
options.SupplyData = (context, data) =>
{
data["foo"] = "bar";
};
});
if (env.IsDevelopment())
{
spa.UseAngularCliServer(npmScript: "start");
}
});
我查看了 Github 上的文档和源代码,但找不到如何配置 ASP.net Core 以将特定路由与给定 SPA 相关联。有人有什么想法吗?
感谢 SteveSandersonMS and chris5287 在 Github 上指出我的解决方案。
IApplicationBuilder.Map
可以将路径分隔到不同的关注区域。如果将对 app.UseSpa
的调用包装在对 app.Map
的调用中,则 SPA 将仅针对 Map
调用指定的路径进行处理。 app.UseSpa
调用最终看起来像:
app.Map("/app1", app1 =>
{
app1.UseSpa(spa =>
{
// To learn more about options for serving an Angular SPA from ASP.NET Core,
// see https://go.microsoft.com/fwlink/?linkid=864501
spa.Options.SourcePath = "ClientApp";
spa.UseSpaPrerendering(options =>
{
options.BootModulePath = $"{spa.Options.SourcePath}/dist-server/main.bundle.js";
options.BootModuleBuilder = env.IsDevelopment()
? new AngularCliBuilder(npmScript: "build:ssr:en")
: null;
options.ExcludeUrls = new[] { "/sockjs-node" };
options.SupplyData = (context, data) =>
{
data["foo"] = "bar";
};
});
if (env.IsDevelopment())
{
spa.UseAngularCliServer(npmScript: "start --app=app1 --base-href=/app1/ --serve-path=/");
}
});
});
您可以根据需要多次调用 app.Map
来配置您的 SPA。还要注意最后对 spa.UseAngularCliServer
调用的修改:您需要设置 --base-href
和 --serve-path
以匹配您的特定配置。
我有一个 Angular 5 应用程序,我想使用 Angular Universal 在 ASP.net Core 上使用最新的 Angular template RC. I've followed the docs and have the application up and running. The problem is that I am also using Angular's i18n tools 托管它,它会生成多个已编译的应用程序,1每个语言环境。我需要能够主持 https://myhost.com/{locale}/
.
我知道我可以为每个语言环境启动 ASP.net 核心应用程序的一个实例,并在网络服务器中设置托管,以使用适当的路径路由到关联的应用程序,但这似乎过分了我.
路由配置为:
// app is an instance of Microsoft.AspNetCore.Builder.IApplicationBuilder
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller}/{action=Index}/{id?}");
});
SpaServices 配置为:
app.UseSpa(spa =>
{
// To learn more about options for serving an Angular SPA from ASP.NET Core,
// see https://go.microsoft.com/fwlink/?linkid=864501
spa.Options.SourcePath = "ClientApp";
spa.UseSpaPrerendering(options =>
{
options.BootModulePath = $"{spa.Options.SourcePath}/dist-server/main.bundle.js";
options.BootModuleBuilder = env.IsDevelopment()
? new AngularCliBuilder(npmScript: "build:ssr:en")
: null;
options.ExcludeUrls = new[] { "/sockjs-node" };
options.SupplyData = (context, data) =>
{
data["foo"] = "bar";
};
});
if (env.IsDevelopment())
{
spa.UseAngularCliServer(npmScript: "start");
}
});
我查看了 Github 上的文档和源代码,但找不到如何配置 ASP.net Core 以将特定路由与给定 SPA 相关联。有人有什么想法吗?
感谢 SteveSandersonMS and chris5287 在 Github 上指出我的解决方案。
IApplicationBuilder.Map
可以将路径分隔到不同的关注区域。如果将对 app.UseSpa
的调用包装在对 app.Map
的调用中,则 SPA 将仅针对 Map
调用指定的路径进行处理。 app.UseSpa
调用最终看起来像:
app.Map("/app1", app1 =>
{
app1.UseSpa(spa =>
{
// To learn more about options for serving an Angular SPA from ASP.NET Core,
// see https://go.microsoft.com/fwlink/?linkid=864501
spa.Options.SourcePath = "ClientApp";
spa.UseSpaPrerendering(options =>
{
options.BootModulePath = $"{spa.Options.SourcePath}/dist-server/main.bundle.js";
options.BootModuleBuilder = env.IsDevelopment()
? new AngularCliBuilder(npmScript: "build:ssr:en")
: null;
options.ExcludeUrls = new[] { "/sockjs-node" };
options.SupplyData = (context, data) =>
{
data["foo"] = "bar";
};
});
if (env.IsDevelopment())
{
spa.UseAngularCliServer(npmScript: "start --app=app1 --base-href=/app1/ --serve-path=/");
}
});
});
您可以根据需要多次调用 app.Map
来配置您的 SPA。还要注意最后对 spa.UseAngularCliServer
调用的修改:您需要设置 --base-href
和 --serve-path
以匹配您的特定配置。