调整ASP.NET Core路由优先级:先匹配常规路由再用SlugRouteValueTransformer
解决ASP.NET Core路由优先级问题
问题原因
ASP.NET Core的路由匹配遵循注册顺序优先原则:越先注册的路由,越先被用来匹配请求,一旦匹配成功就会终止后续路由的评估。你当前的问题是动态路由的匹配逻辑覆盖了常规路由,大概率是因为API路由(如果有的话)注册在了动态路由之后,或是对路由匹配顺序的实际生效逻辑理解有误。
解决方案
调整路由注册顺序,将所有常规控制器路由(区域、默认控制器、API路由)放在动态路由之前注册,让动态路由作为最后兜底的选项:
修改后的代码示例
// 1. 注册admin区域路由 app.MapControllerRoute( name: "admin", pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"); // 2. 注册默认控制器路由 app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); // 3. 注册API路由(如果使用属性路由的API控制器) app.MapControllers(); // 4. 最后注册动态路由,仅当前面路由都不匹配时生效 app.MapDynamicControllerRoute<SlugRouteValueTransformer>("/{**slug}");
补充说明
- 如果你的API使用约定路由而非属性路由,需要在动态路由之前添加API约定路由的注册:
app.MapControllerRoute( name: "api", pattern: "api/{controller}/{action=Index}/{id?}"); - 动态路由的
/{**slug}是贪婪匹配模板,会匹配所有未被前面路由覆盖的请求,因此必须放在最后注册才能实现“兜底”效果。
内容的提问来源于stack exchange,提问作者Herman
相关产品推荐
相关产品推荐

