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

时间:2015-05-15 02:52:06

标签: asp.net-core

Stephen Walther的这篇文章讨论了通过修改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?

4 个答案:

答案 0 :(得分:18)

Startup的{​​{1}}方法中,Configureapp

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”。

如果您不想使用属性路由,请使用上述方法并使用以下路由映射:

/

答案 1 :(得分:14)

在SO上找到了这个非常好的答案:https://stackoverflow.com/a/34890926/990356

<强>上下文

我有一个SPA应用程序,ASP.NET Core提供一些REST API +'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();
}

请注意,订单很重要。

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

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

答案 2 :(得分:5)

我正在使用vnext在Azure上部署AngularJS应用程序。感谢Matt我能够制作这个片段:

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

除了我的REST api调用之外,它将所有内容路由到Angular App。

答案 3 :(得分:0)

根据@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?}"
    );
  });