ASP.NET MVC路由配置问题:如何避免/about路由误捕获请求
解决ASP.NET MVC路由异常问题
我来帮你搞定这个路由问题!你当前的第二个路由规则确实会导致意外的请求捕获,原因很简单:那个{id}模板是无约束的参数匹配,它会匹配任何单个路径段的请求(比如example.com/foo、example.com/123这类),不管这个段是什么内容,都会直接导向Home/About,这就是路由行为异常的根源。
解决方案1:使用固定路由(推荐)
既然你只需要example.com/about指向About页面,直接配置一个固定路径的路由就最稳妥,不会误匹配其他请求。而且要注意把这个路由放在默认路由的前面(路由是从上到下匹配的,优先匹配更具体的规则):
app.UseMvc(routes => { // 先配置固定的about路由 routes.MapRoute( name: "about", template: "about", defaults: new { controller = "Home", action = "About" }); // 再配置默认路由 routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); });
这个配置只会精准匹配/about请求,其他单段请求(比如/contact)会走默认路由,尝试匹配对应的控制器和动作方法。
解决方案2:给参数添加约束
如果以后你需要类似的单段路由,但只想让特定值匹配Home/About,可以给路由参数添加正则约束,只允许id等于about时才匹配:
app.UseMvc(routes => { routes.MapRoute( name: "about", template: "{id}", defaults: new { controller = "Home", action = "About" }, constraints: new { id = "about" }); // 约束id必须是"about" routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); });
这种方式通过正则约束限制了参数的取值,同样不会捕获其他单段请求。
为什么原来的配置会出问题?
ASP.NET MVC的路由匹配是按顺序匹配第一个符合模板的规则,你原来的{id}模板没有任何约束,任何单个路径段的URL都会被它匹配,导致原本应该由默认路由处理的请求(比如访问其他控制器的首页)被错误导向了Home/About。调整路由顺序或者添加约束,就能避免这个问题。
内容的提问来源于stack exchange,提问作者TidyDev
相关产品推荐
相关产品推荐

