MVC 6 路由,SPA 回退 + 404 错误页面 [英] MVC 6 Routing, SPA fallback + 404 Error Page
问题描述
使用 RC1 的 ASP在 .NET Core 1.0 的 MVC 6 中,您可以在调用 app.UseMvc
时从 Startup.Configure
函数中映射路由.我已经映射了一个spa-fallback"路由,以确保 HomeController
和 Index
视图是默认值,如下所示:
With RC1 of ASP.NET Core 1.0's MVC 6 you can map routes from within your Startup.Configure
function when invoking app.UseMvc
. I have mapped a "spa-fallback" route that will ensure that the HomeController
and Index
view are the defaults like so:
public void Configure(IApplicationBuilder app,
IHostingEnvironment env,
ILoggerFactory loggerFactory)
{
// ... omitted for brevity
app.UseExceptionHandler("/Home/Error");
app.UseStatusCodePagesWithRedirects("/Home/Error/{0}");
app.UseMvc(routes =>
{
routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
routes.MapRoute("spa-fallback", "{*anything}", new { controller = "Home", action = "Index" });
routes.MapWebApiRoute("defaultApi", "api/{controller}/{id?}");
});
}
我希望回退,以便我的 Angular2 应用的路由不会导致 HTTP 状态代码 404,未找到.但我还需要正确处理当用户无意中尝试导航到不存在的页面视图时.您可能注意到我还调用了 app.UseStatusCodePagesWithRedirects("/Home/Error/{0}");
.
I desire the fallback so that my Angular2 app's routes will not result in an HTTP Status Code of 404, Not Found. But I also need to correctly handle when a user does inadvertently attempt to navigate to a page view that doesn't exist. You might notice that I have also called app.UseStatusCodePagesWithRedirects("/Home/Error/{0}");
.
使用状态代码和spa-fallback"路由重定向到我的错误页面的调用似乎是相互排斥的——这意味着我似乎只能拥有一个或另一个(但遗憾的是不能同时拥有).有谁知道我如何才能做到两全其美?
The call to redirect to my error page with the status code and the "spa-fallback" route seem mutually exclusive -- meaning it appears that I can only have one or the other (but sadly not both). Does anyone know how I could manage to have the best of both worlds?
推荐答案
我花了一些时间才弄清楚如何在不使用 MVC 提供索引的情况下做到这一点,并且仍然收到 404 丢失文件的消息.这是我的 http 管道:
It took me some time to figure out how to do this without serving my index using MVC and to still receive 404s for missing files. Here's my http pipeline:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseDefaultFiles();
app.UseStaticFiles();
app.UseMvc(
routes => {
routes.MapRoute(
name: "api",
template: "api/{controller}/{action}/{id?}");
// ## commented out since I don't want to use MVC to serve my index.
// routes.MapRoute(
// name:"spa-fallback",
// template: "{*anything}",
// defaults: new { controller = "Home", action = "Index" });
});
// ## this serves my index.html from the wwwroot folder when
// ## a route not containing a file extension is not handled by MVC.
// ## If the route contains a ".", a 404 will be returned instead.
app.MapWhen(context => context.Response.StatusCode == 404 &&
!Path.HasExtension(context.Request.Path.Value),
branch => {
branch.Use((context, next) => {
context.Request.Path = new PathString("/index.html");
Console.WriteLine("Path changed to:" + context.Request.Path.Value);
return next();});
branch.UseStaticFiles();
});
}
这篇关于MVC 6 路由,SPA 回退 + 404 错误页面的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!