Как настроить маршрутизацию основного сервера ASP.net для нескольких SPA, размещенных на SpaServices

У меня есть приложение Angular 5, которое я хочу разместить с Angular Universal на ASP.net Core, используя последний шаблон RC Angular. Я следовал за документами, и приложение уже запущено и работает. Проблема в том, что я также использую инструменты Angular i18n, которые создают несколько скомпилированных приложений, по одному на локаль. Я должен быть в состоянии принять каждого из 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. У кого-нибудь есть идеи?

1 ответ

Решение

Спасибо https://github.com/SteveSandersonMS и chris5287 за Github за указание на решение этой проблемы.

IApplicationBuilder.Map может разделить пути в различных областях, вызывающих беспокойство. Если вы заверните звонок app.UseSpa в вызове app.MapSPA будет обрабатываться только для пути, указанного 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 чтобы соответствовать вашей конкретной конфигурации.

Другие вопросы по тегам