web-dev-qa-db-ja.com

SpaServicesでホストされる複数のSPAのASP.net Coreサーバールーティングを構成する方法

最新の AngularテンプレートRC を使用して、ASP.net CoreでAngular UniversalでホストするAngular 5アプリケーションがあります。私はドキュメントに従って、アプリケーションを稼働させました。問題は、Angularの i18n tools を使用していることです。これは、ロケールごとに複数のコンパイル済みアプリケーションを生成します。 https://myhost.com/{locale}/からそれぞれをホストできるようにする必要があります。

各ロケールでASP.net Coreアプリのインスタンスを起動し、適切なパスが関連付けられたアプリにルーティングされるようにWebサーバーでホスティングを設定できることは知っていますが、これは私にとって過度に思えます。

ルートは次のもので構成されます。

// 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のドキュメントとソースを調べましたが、特定のルートを特定のSPAに関連付けるようにASP.net Coreを構成する方法を見つけることができません。誰にもアイデアはありますか?

30
asgallant

SteveSandersonMS および chris5287 のおかげで、この問題の解決策を示してくれました。

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=/");
        }
    });
});

SPAを構成するのに必要なだけapp.Mapを呼び出すことができます。最後のspa.UseAngularCliServer呼び出しの変更にも注意してください。特定の構成に一致するように--base-href--serve-pathを設定する必要があります。

29
asgallant