web-dev-qa-db-fra.com

Comment configurer le routage de serveur ASP.net Core pour plusieurs SPA hébergés avec SpaServices

J'ai une application Angular 5 que je souhaite héberger avec Angular Universal sur ASP.net Core à l'aide du dernier modèle angulaire RC .J'ai suivi la documentation et que l'application est en marche. Le problème est que j'utilise aussi les outils i18n tools d'Angular, qui produisent plusieurs applications compilées, une par langue. Hébergez chacun de https://myhost.com/{locale}/.

Je sais que je peux créer une instance de l'application ASP.net Core pour chaque paramètre régional et configurer l'hébergement sur le serveur Web afin de définir l'itinéraire approprié pour accéder à l'application associée, mais cela me semble excessif.

Les itinéraires sont configurés avec:

// app is an instance of Microsoft.AspNetCore.Builder.IApplicationBuilder
app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller}/{action=Index}/{id?}");
});

SpaServices sont configurés avec:

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

J'ai consulté la documentation et les sources sur Github et je ne trouve pas comment configurer ASP.net Core pour associer une route spécifique à un SPA donné. Quelqu'un a des idées?

30
asgallant

Merci à SteveSandersonMS et chris5287 à Github pour m'avoir indiqué la solution à ce sujet.

IApplicationBuilder.Map peut séparer les chemins en différents domaines de préoccupation. Si vous enregistrez un appel à app.UseSpa dans un appel à app.Map, le SPA ne sera traité que pour le chemin spécifié par l’appel Map. Le app.UseSpa appel finit par ressembler à:

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

Vous pouvez faire autant d'appels à app.Map si nécessaire pour configurer vos SPA. Notez également la modification du spa.UseAngularCliServer appel à la fin: vous devrez définir --base-href et --serve-path pour correspondre à votre configuration particulière.

29
asgallant