如何强制 ASP.NET 5 MVC 项目中的所有请求重定向到根“/”?

How to force all requests in ASP.NET 5 MVC project to redirect to root "/"?

Stephen Walther 的 post 讨论了通过修改 web.config system.webServer / rewrite 部分重定向 MVC 项目中的所有请求。

http://stephenwalther.com/archive/2015/01/16/asp-net-5-and-angularjs-part-3-adding-client-routing

但是,必须将 web.config xml 文件重新引入 ASP.NET 5 项目似乎是错误的。

在 ASP.NET 5 中还有其他方法吗?也许通过新 config.json?

在您的 StartupConfigure 方法中,其中 app 是您的 IApplicationBuilder:

app.Run(context =>
{
    context.Response.Redirect("/");
    return Task.FromResult<object>(null);
});

这会将所有未处理的请求发送到应用程序的根目录。将其放在最后,在任何 UseStaticFiles() 或其他中间件注册之后。

请注意,这不会捕获高于此的注册;如果您的服务器上有其他路由(例如控制器操作等),则不会捕获它们。这应该与您不需要排除示例中的模式的附加好处相得益彰。

或者...

如果您为单页应用程序执行此操作,您可能希望为您的用户允许深度链接。我为此使用了一个简单的属性路由:

[Route("", Order = -1)]
[Route("{*pathInfo}", Order = 1000)]
public async Task<IActionResult> Index(string pathInfo = "", CancellationToken cancellationToken = default(CancellationToken))
{    
    return View("UiView");
}

这会将默认请求 (/) 映射到优先级,同时将所有其他请求(允许默认排序等优先)映射到您的“UiView”。

如果你不想使用属性路由,使用上面的方法和下面的路由映射:

// Before all your routes
routeBuilder.MapRoute(
    "Root",
    "",
    defaults: new { controller = "Home", action = "Index" });

// Your routes here

// After all your routes
routeBuilder.MapRoute(
    "DeepLink",
    "{*pathInfo}",
    defaults: new { controller = "Home", action = "Index" });

我正在使用 vnext 在 Azure 上部署 AngularJS 应用程序。多亏了马特,我才能够制作这个片段:

app.Run(context =>
            {
                if(context.Request.Path.Value != "/api") context.Response.Redirect("/");
                return Task.FromResult<object>(null);
            }
        );

它将除我的 REST api 调用之外的所有内容路由到 Angular 应用程序。

基于@Matt DeKrey 的回答并在我公司的一位开发人员的帮助下,以下是我如何使用 ASP.NET Core 1 MVC 将所有请求路由到单个视图。非常适合需要深层链接的 Angular2 应用程序。

HomeController.cs

里面public class HomeController : Controller

[Route("", Order = -1)]
[Route("{*pathInfo}", Order = 1000)]
public async Task<IActionResult> Index(string pathInfo = ""))
{    
    return View("View");
}

Startup.cs

里面public void Configure

  app.UseMvc(routes =>
  {
    routes.MapRoute(
      "default",
      "{controller=Home}/{action=Index}/{id?}"
    );
  });

在 SO 上找到了这个非常好的答案:

上下文:

我有一个 SPA 应用程序,ASP.NET Core 服务于一些 REST APIs + 'wwwroot/index.html'。

我在 SPA 应用程序(客户端)中处理我的路由,当用户使用给定路由刷新浏览器时它不起作用。

示例:使用 URL http://localhost:5000/Account 刷新浏览器会出现 404 错误,因为服务器上没有文件 'wwwroot/Account/index.html' 尽管这是客户端应用程序内部的有效路由。

解法:

public void Configure(IApplicationBuilder app)
{
    app.UseMvc();

    app.UseStatusCodePagesWithReExecute("/");

    app.UseDefaultFiles();
    app.UseStaticFiles();
}

请注意顺序很重要。

=> 这意味着如果路由与服务器上的文件或任何已知的(例如 REST API)不匹配,服务器将提供“/”('wwwroot/index.html')同时保持URL完好无损。

使用 React/React 路由器应用程序和 ASP.NET MVC Core 1.1 进行测试