如何强制 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?
在您的 Startup
的 Configure
方法中,其中 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 进行测试
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?
在您的 Startup
的 Configure
方法中,其中 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 进行测试