Что я использую, что хорошо работает Microsoft.AspNetCore.Builder.SpaRouteExtensions.MapSpaFallbackRoute
:
app.UseMvc(routes =>
{
// Default route for SPA components, excluding paths which appear to be static files (have an extension)
routes.MapSpaFallbackRoute(
"spaFallback",
new { controller = "Home", action = "Index" });
});
HomeController.Index
имеет эквивалент вашего index.html
. Возможно, вы также можете перейти на статическую страницу.
Немного не по теме, но если у вас также есть API в том же проекте под api
папке вы можете установить ответ по умолчанию 404 для любых API маршрутов, которые не соответствуют друг другу:
routes.MapRoute(
"apiDefault",
"api/{*url}",
new { controller = "Home", action = "ApiNotFound" });
Вы бы в конечном итоге следующее поведение:
/controller
=> Нет расширения, поэтому служить страницу SPA по умолчанию от HomeController.Index
и пусть SPA ручки маршрутизации
/file.txt
=> Удлинитель обнаружено, служат статический файл
/api/controller
=> правильный ответ по API (использование атрибутов маршрутизации или настроить другую карту для контроллеров API)
/api/non-existent-route
=> 404 NotFound()
вернулся из HomeController.ApiNotFound
В во многих случаях вам понадобится API в отдельном проекте, но это жизнеспособная альтернатива.
Если вы уже находитесь в элементе маршрутизации, вы прошли мимо p где статические файлы подаются в конвейере. Вы можете создать действие контроллера catch-all, которое вместо этого вернет содержимое файла. – DavidG
Есть ли рекомендуемый способ сделать это? – Mardoxx
Не так далеко, насколько я знаю. – DavidG