ASP.NET Core 7 带有多个 Angular 实例

3

我尝试在一个ASP.NET Core 7应用程序下运行多个本地化的Angular应用程序。

目前,我使用默认的ASP.NET Core Web应用程序模板,并在Angular编译时使用--localize开关。这将导致两个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}'。如果使用路由,请使用'IApplicationBuilder.UseEndpoints(...)'注册EndpointMiddleware。

at Microsoft.AspNetCore.Builder.ApplicationBuilder.<>c.b__18_0(HttpContext context)
at Microsoft.AspNetCore.SpaServices.SpaDefaultPageMiddleware.<>c__DisplayClass0_0.b__1(HttpContext context, RequestDelegate next)
at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.SpaServices.SpaDefaultPageMiddleware.<>c__DisplayClass0_0.b__0(HttpContext context, RequestDelegate next)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.InvokeCore(HttpContext context, PathString matchedPath, PathString remainingPath)

这个解决方案适用于ASP.NET Core 5,但大多数我能找到的示例都比较旧。


目前我在每个本地化的UI下运行一个独立的端口,并通过代理服务器将所有内容映射在一起。虽然它能够工作,但是非常丑陋。 - neoky
2
尝试为每个语言环境指定默认页面:spa.Options.DefaultPage = new PathString("/index.html") - kemsky
1
非常感谢你,kemsky。你的信息指引了我正确的方向。我将在几分钟内发布解决方案。 - neoky
1个回答

2

我现在明白如何让它工作了,需要进行以下更改:

首先,我删除了 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();

1
非常感谢,这个完美地解决了问题!我唯一做的不同之处是在!app.Environment.IsDevelopment()时执行此代码块,在这种情况下,我使用默认的app.MapFallbackToFile("index.html")命令。这花费的50个声望值很值得。 - Jan Erik Schlorf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接