如何区分两个接收相同整数参数的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
相关产品推荐
相关产品推荐

