【问题标题】:How to configure ASP.net Core server routing for multiple SPAs hosted with SpaServices如何为 SpaServices 托管的多个 SPA 配置 ASP.net Core 服务器路由
【发布时间】:2018-06-21 08:45:46
【问题描述】:

我有一个 Angular 5 应用程序,我想使用最新的 Angular template RC 在 ASP.net Core 上使用 Angular Universal 托管它。我已经按照文档并启动并运行了应用程序。问题是我也在使用 Angular 的 i18n tools,它会生成多个编译的应用程序,每个语言环境 1 个。我需要能够从https://myhost.com/{locale}/ 主持每个人。

我知道我可以为每个语言环境启动一个 ASP.net Core 应用程序的实例,并在网络服务器中设置托管以使适当的路径路由到相关的应用程序,但这对我来说似乎太过分了。

路由配置:

// 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 相关联。有人有什么想法吗?

【问题讨论】:

  • 如果您使用 IIS,请尝试将所有区域设置应用设置为子应用

标签: asp.net-core asp-net-core-spa-services


【解决方案1】:

感谢 Github 上的 SteveSandersonMSchris5287 为我指明解决方案。

IApplicationBuilder.Map 可以将路径分成不同的关注区域。如果在对app.Map 的调用中包装对app.UseSpa 的调用,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 以匹配您的特定配置。

【讨论】:

  • 你的 build:ssr:en 是什么以及 app1 指的是什么。非常感谢
  • 另一件事,如果你有不同的 BootModulePath 每种语言。例如 ptions.BootModulePath = $"{spa.Options.SourcePath}/dist-server/en/main.bundle.js";和 ptions.BootModulePath = $"{spa.Options.SourcePath}/dist-server/fr/main.bundle.js";
  • hre 是我为 EN "buildssr-i1n8-en-browser" 构建的:"ng build --prod --locale=en --i18n-file src/i18n/messages.en.xlf - -base-href=/en --deploy-url=/en --output-path=dist/en", "buildssr-i1n8-en-server": "ng build --prod --locale=en --i18n -file src/i18n/messages.en.xlf --base-href=/en --deploy-url=/en --output-path=dist-server/en --app 1 --output-hashing=false" ,
  • 我这边似乎没什么用。如果您可以共享整个启动和构建命令,那将是一个很大的帮助。非常感谢
  • 我在这里开了一个新问题:stackoverflow.com/questions/48754386/…
猜你喜欢
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多