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

如何区分两个接收相同整数参数的HttpGet请求?

解决ASP.NET Core中HttpGet路由冲突的问题

你当前的代码里两个HttpGet方法用了完全相同的路由模板[HttpGet("{id}")],ASP.NET Core运行时根本没法区分请求该走哪个方法,必然会抛出AmbiguousMatchException错误。而且还有个小问题:GetItemsByRequestID方法的参数是RequestID,但路由模板里的占位符是{id},参数名称不匹配会导致绑定失败,这个也得一起修正。

针对你的需求,有两种靠谱的解决方式:

方案一:修改路由模板(推荐,符合REST风格)

把其中一个方法的路由改成带有明确语义的路径,比如给按请求ID查询的方法加上专属前缀,这样两个路由就完全区分开了:

// 按条目ID查询:GET /controller/{id}
[HttpGet("{id}")]
public async Task<ActionResult<IEnumerable<SupplierInfo>>> GetItems(int id)
{
    var item = await this.supplierInfoRepository.GetItem(id);
    return Ok(item);
}

// 按请求ID查询:GET /controller/requestid/{requestId}
[HttpGet("requestid/{requestId}")]
public async Task<ActionResult<IEnumerable<SupplierInfo>>> GetItemsByRequestID(int requestId)
{
    var item = await this.supplierInfoRepository.GetItemByRequestID(requestId);
    return Ok(item);
}

这样的路径语义清晰,客户端一看就知道不同路径对应的查询逻辑,也完全避免了路由冲突。你提到的将其中一个路由改为controller/requestid/{id}、另一个保留controller/{id}的思路,就是这个方案的实现方式,直接用就行。

方案二:使用查询参数

如果不想修改路径结构,也可以把其中一个方法改成接收查询参数,比如:

// 按条目ID查询:GET /controller/{id}
[HttpGet("{id}")]
public async Task<ActionResult<IEnumerable<SupplierInfo>>> GetItems(int id)
{
    var item = await this.supplierInfoRepository.GetItem(id);
    return Ok(item);
}

// 按请求ID查询:GET /controller?requestId=xxx
[HttpGet]
public async Task<ActionResult<IEnumerable<SupplierInfo>>> GetItemsByRequestID([FromQuery] int requestId)
{
    var item = await this.supplierInfoRepository.GetItemByRequestID(requestId);
    return Ok(item);
}

这种方式适合把请求ID作为可选查询条件的场景,但语义上不如第一种方案直观。

内容的提问来源于stack exchange,提问作者Venkat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 05:55:18