У меня возникла техническая проблема с методом app.MapWhen()
в .NET Core для обработки маршрутов в моем приложении.
Контекст
У меня есть два проекта Angular v15, которые служат интерфейсом для моего приложения .NET Core 6.
back
, расположенный в wwwroot/back
survey
, расположенный в wwwroot/survey
Цель
Я хочу, чтобы приложение загружало проект survey
, когда URL-адрес равен www.toto.com/survey
, и загружало проект back
для любого другого URL-адреса.
Конфигурация
Вот моя текущая настройка:
app.UseFileServer(new FileServerOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(env.WebRootPath, "survey")),
RequestPath = new PathString("/survey")
});
app.UseFileServer(new FileServerOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(env.WebRootPath, "back")),
RequestPath = ""
});
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapFallback(context =>
{
if (context.Request.Path.StartsWithSegments("/survey"))
{
context.Response.ContentType = "text/html";
return context.Response.SendFileAsync(Path.Combine(env.WebRootPath, "survey", "index.html"));
}
// Serve the index.html from back folder for all other paths
context.Response.ContentType = "text/html";
return context.Response.SendFileAsync(Path.Combine(env.WebRootPath, "back", "index.html"));
});
});
Проблема
Независимо от того, какой проект я пытаюсь загрузить, если URL-адрес содержит параметр (например, /survey
), файл index.html
загружается правильно, а файлы JavaScript — нет. Ошибка указывает на то, что загружаются не те файлы.
У меня проблема только с путем /survey, обратный путь работает очень хорошо.
Вопрос
Как я могу настроить маршрутизацию и обработку статических файлов, чтобы правильные файлы JavaScript загружались для каждого проекта при доступе к соответствующим URL-адресам?
Спасибо за помощь!
Спасибо @JeremyLakeman, я редактирую свой пост со своими изменениями и результатами. Это не работает, у вас есть идея?
Вот пример, который я начинаю с asp.net core webapi .net6.
Стартап.cs
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddSpaStaticFiles(configuration =>
{
configuration.RootPath = "wwwroot";
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseSpaStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapWhen(context => !context.Request.Path.StartsWithSegments("/survey"), mainApp =>
{
mainApp.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(Path.Combine(env.WebRootPath, "back")),
RequestPath = ""
});
mainApp.UseSpa(spa =>
{
spa.Options.SourcePath = "wwwroot/back";
spa.Options.DefaultPageStaticFileOptions = new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(Path.Combine(env.WebRootPath, "back")),
};
});
});
app.MapWhen(context => context.Request.Path.StartsWithSegments("/survey"), surveyApp =>
{
surveyApp.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(Path.Combine(env.WebRootPath, "survey")),
RequestPath = "/survey"
});
surveyApp.UseSpa(spa =>
{
spa.Options.SourcePath = "wwwroot/survey";
spa.Options.DefaultPageStaticFileOptions = new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(Path.Combine(env.WebRootPath, "survey")),
};
});
});
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
Моя структура проекта такова.
И код, показывающий проект.
console.info("Back Project JavaScript Loaded");
console.info("Survey Project JavaScript Loaded");
Тест
Я бы не использовал
.MapWhen
, просто использовал 2 статических файла Learn.microsoft.com/en-us/aspnet/core/fundamentals/… Или просто.MapWhen
сначала URL-адреса опроса.