如何在ASP.NET Core 2.0 GET请求中传入超过29个参数?
解决ASP.NET Core 2.0 GET方法添加第30个参数时的OverflowException问题
这个异常的根源其实是ASP.NET Core路由系统内部的路由权重计算导致的。路由匹配时,框架会给每个路由参数分配一个权重值,用来确定路由的优先级。当路由参数数量达到30个时,累加的权重值超出了Decimal类型的最大取值范围,于是抛出了OverflowException。
下面是几个可行的解决方案,按推荐程度排序:
1. 改用查询参数替代路由参数
把所有可选参数从路由模板中移除,通过查询字符串传递参数。这样既避免了路由参数过多的问题,也符合HTTP GET请求的最佳实践(可选参数适合放在查询字符串中)。
修改后的代码示例:
[HttpGet("GetObjects")] public IActionResult GetObjects(List<string> parameter1 = null, decimal? parameter2 = null, ..., bool? parameter30 = null) { // 你的业务逻辑处理 }
调用示例:
GET /GetObjects?parameter1=foo¶meter1=bar¶meter2=199.99&...¶meter30=true
2. 封装参数为DTO类
创建一个专门的DTO(数据传输对象)来承载所有查询参数,这样方法签名会更简洁,也更易于维护和扩展。
代码示例:
// 定义查询参数DTO public class ObjectQueryParams { public List<string> Parameter1 { get; set; } public decimal? Parameter2 { get; set; } // 依次添加到Parameter30 public bool? Parameter30 { get; set; } } // 控制器方法 [HttpGet("GetObjects")] public IActionResult GetObjects([FromQuery] ObjectQueryParams queryParams) { // 使用queryParams.Parameter1、queryParams.Parameter2等进行逻辑处理 }
3. 精简路由参数(仅保留必要项)
如果某些参数必须放在路由中(比如必填的资源标识),只保留少量核心参数在路由模板里,其余所有可选参数都改用查询参数。这样既能满足路由的需求,又不会触发内部的Decimal溢出问题。
示例:
// 只保留必填的parameter1在路由中,其余用查询参数 [HttpGet("GetObjects/{parameter1}")] public IActionResult GetObjects(List<string> parameter1, decimal? parameter2 = null, ..., bool? parameter30 = null) { // 业务逻辑 }
额外说明
ASP.NET Core的路由系统并不适合处理大量的可选路由参数,除了会触发这类内部异常外,还会降低路由匹配的效率,同时让路由模板变得难以阅读和维护。使用查询参数或DTO是更规范、更可持续的方案。
内容的提问来源于stack exchange,提问作者axelrotter
相关产品推荐
相关产品推荐

