如何在ASP.NET Core MVC路由中添加文件扩展名以兼容旧系统URL规则
错误原因
你当前的路由写法没有明确告知ASP.NET Core路由系统.ext是固定后缀,路由会把Index.ext整体作为action参数的取值去匹配控制器方法,而你实际的控制器Action名称都不带.ext后缀,导致所有无特殊路由配置的Action都被判定为匹配候选,最终抛出歧义匹配异常。
解决方案
第一步:给路由添加Action参数约束
修改路由注册代码,给action参数添加正则约束,明确告知路由系统仅将.ext前面的合法字符识别为Action名称:
endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}.ext/{id?}", constraints: new { action = @"[a-zA-Z0-9_]+" });
第二步:调整中间件顺序避免静态文件拦截
ASP.NET Core默认会把带.的URL判定为静态文件请求,你需要调整Program.cs里的中间件顺序,确保路由中间件先于静态文件中间件执行,避免带.ext的动态路由被静态文件中间件拦截:
// 先注册路由中间件 app.UseRouting(); // 再注册静态文件中间件 app.UseStaticFiles(); // 后续其他中间件 app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}.ext/{id?}", constraints: new { action = @"[a-zA-Z0-9_]+" });
修改完成后,/Home/Index.ext就会正确匹配到HomeController的Index动作,/Home/Privacy.ext会匹配到Privacy动作,不会再出现歧义匹配错误。
内容的提问来源于stack exchange,提问作者MarkMpn
相关产品推荐
相关产品推荐

