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();