You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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&parameter1=bar&parameter2=199.99&...&parameter30=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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:35:19