.NET 6路由中间传递空参数失败(404)求助
解决.NET 6路由中间传递空参数的404问题
你遇到的问题是因为ASP.NET Core(包括.NET 6)的路由系统默认会合并连续的斜杠,导致/WeatherForecast/1//1被处理成/WeatherForecast/1/1,无法匹配你的路由模板{id}/{p1?}/{p2?},而旧版.NET Framework的路由不会做这个合并,所以之前能正常运行。
下面给你几个解决办法:
1. 禁用路由的斜杠合并功能
在Program.cs里添加路由配置,关闭连续斜杠的合并:
builder.Services.Configure<RouteOptions>(options => { options.SuppressMergeSlashes = true; });
这样路由就会保留连续的斜杠,/WeatherForecast/1//1就能正确匹配到id=1、p1=null(会使用默认值0)、p2=1的参数组合。
2. 使用查询参数传递可选参数
更推荐这种符合REST规范的方式,把中间的空参数换成查询字符串,比如:https://localhost:7242/WeatherForecast/1?p2=1
你的代码不需要修改,因为p1和p2已经是可选参数,会自动绑定查询字符串的值,这样既避免了路由匹配问题,URL也更规范。
3. 调整路由模板(可选)
如果一定要用路径参数的形式,可以修改路由模板,允许空路径段匹配:
[HttpGet("{id}/{p1:regex(^$|\\d+)?}/{p2?}")]
不过这种方式需要编写正则表达式匹配空值或数字,不如前两种方法简洁。
内容的提问来源于stack exchange,提问作者user3083835
相关产品推荐
相关产品推荐

