ASP.NET Core 7 с несколькими экземплярами Angular

Я пытаюсь запустить одно приложение ASP.NET Core 7 с несколькими локализованными приложениями Angular.

В настоящее время я использую шаблон веб-приложения ASP.NET Core по умолчанию с--localizeвключите компиляцию Angular. Это приводит к двум папкам Angular:

      ClientApp/dist/en
ClientApp/dist/de

Я попытался настроить сопоставление следующим образом:

      ...
app.Map("/de",
    userApp =>
    {
        userApp.UseSpa(spa =>
        {
            spa.Options.SourcePath = "ClientApp/dist/de";
            spa.Options.DefaultPageStaticFileOptions = new StaticFileOptions
                                                       {
                                                           FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "ClientApp", "dist", "de"))
                                                       };

            // if (app.Environment.IsDevelopment())
            //     spa.UseProxyToSpaDevelopmentServer("http://localhost:4000");
        });
    });
app.Map("/en",
    userApp =>
    {
        userApp.UseSpa(spa =>
        {
            spa.Options.SourcePath = "ClientApp/dist/en";
            spa.Options.DefaultPageStaticFileOptions = new StaticFileOptions
                                                       {
                                                           FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "ClientApp", "dist", "en"))
                                                       };
        });
    });

app.MapFallbackToFile("index.html");

app.Run();

Но когда я прошуlocalhost:80/de, я получаю сообщение об ошибке:

ошибка: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1]

При выполнении запроса произошло необработанное исключение.

System.InvalidOperationException: запрос достиг конца конвейера без выполнения конечной точки: «Fallback {*path:nonfile}». Пожалуйста, зарегистрируйте EndpointMiddleware, используя 'IApplicationBuilder.UseEndpoints(...)', если используется маршрутизация.

в Microsoft.AspNetCore.Builder.ApplicationBuilder.<>c.b__18_0(контекст HttpContext)
в Microsoft.AspNetCore.SpaServices.SpaDefaultPageMiddleware.<>c__DisplayClass0_0.b__1(контекст HttpContext, далее RequestDelegate)
в Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke( Контекст HttpContext)
в Microsoft.AspNetCore.SpaServices.SpaDefaultPageMiddleware.<>c__DisplayClass0_0.b__0(контекст HttpContext, далее RequestDelegate)
в Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.InvokeCore(контекст HttpContext, PathString matchedPath, PathString оставшийся путь)

Это решение работало в ASP.NET Core 5, но большинство примеров, которые я могу найти, намного старше.

1 ответ

Я получил его сейчас, чтобы работать, с этими изменениями:

Сначала я бросилapp.MapFallbackToFile("index.html");и переместил его в сопоставления вот такspa.Options.DefaultPage = new PathString("/en/index.html");.

Во-вторых, я должен был добавитьuserApp.UseSpaStaticFiles(...).

А вот и полный код:

      app.Map("/de",
    userApp =>
    {
        userApp.UseSpaStaticFiles(new StaticFileOptions
                                  {
                                      FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "de"))
                                  });
        userApp.UseSpa(spa =>
        {
            spa.Options.DefaultPage = new PathString("/de/index.html");

            if (app.Environment.IsDevelopment())
                spa.UseProxyToSpaDevelopmentServer("http://localhost:4000");
        });
    });
app.Map("/en",
    userApp =>
    {
        userApp.UseSpaStaticFiles(new StaticFileOptions
                                  {
                                      FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "en"))
                                  });
        userApp.UseSpa(spa =>
        {
            spa.Options.DefaultPage = new PathString("/en/index.html");

            if (app.Environment.IsDevelopment())
                spa.UseProxyToSpaDevelopmentServer("http://localhost:4001");
        });
    });

app.UseWhen(context => !context.Request.Path.StartsWithSegments("/api"), appBuilder =>
{
    appBuilder.Use((Func<HttpContext, Func<Task>, Task>)((context, _) =>
                                                            {
                                                                context.Response.Redirect("/de");
                                                                return Task.CompletedTask;
                                                            }));
});

app.Run();
Другие вопросы по тегам