ASP.NET Core 2 Web API路由问题:第二个方法被路由至第一个方法
问题分析与解决方案
你遇到的问题核心是第二个Get方法的路由模板写错了,导致请求无法正确匹配到它,反而被路由到了第一个无参数的Get方法。
具体问题点
看你的第二个方法的路由特性:
[HttpGet("searchstring:aplha")]
这里有两个关键错误:
- 拼写错误:
aplha应该是alpha(字母顺序写错了); - 路由模板语义错误:这个写法会被ASP.NET Core解析为固定的路径片段——也就是说只有当你的请求路径是
api/hospital/searchstring:aplha时才会匹配这个方法。但你大概率是想通过查询参数(比如api/hospital?searchstring=xxx)或者路径参数(api/hospital/xxx)来传递searchstring,这个模板完全不符合你的需求。
正确的写法方案
根据你的需求,分两种场景给出正确配置:
场景1:通过查询参数传递searchstring
如果你希望通过api/hospital?searchstring=xxx这样的请求来调用第二个方法,可以给它一个明确的路由标识(避免和无参数Get冲突),同时确保参数绑定正确:
[Route("api/[controller]")] public class HospitalController : Controller { [HttpGet] public IActionResult Get() { return new ObjectResult(""); } // 给这个方法加一个路由前缀,比如"search" [HttpGet("search")] public IActionResult Get([FromQuery] string searchstring) { return new ObjectResult(searchstring); } [HttpGet("{Id:int}")] public IActionResult Get(int Id) { return new ObjectResult(Id); } }
此时请求api/hospital/search?searchstring=test就会正确匹配第二个方法。
场景2:通过路径参数传递searchstring
如果你希望通过api/hospital/test这样的路径来传递字符串参数,需要修正路由模板的拼写和格式:
[Route("api/[controller]")] public class HospitalController : Controller { [HttpGet] public IActionResult Get() { return new ObjectResult(""); } // 修正拼写为alpha,并使用正确的路径参数模板 [HttpGet("{searchstring:alpha}")] public IActionResult Get(string searchstring) { return new ObjectResult(searchstring); } [HttpGet("{Id:int}")] public IActionResult Get(int Id) { return new ObjectResult(Id); } }
此时:
api/hospital/abc会匹配第二个方法(因为abc符合alpha约束,只能是字母);api/hospital/123会匹配第三个方法(符合int约束);api/hospital会匹配第一个方法。
额外说明
ASP.NET Core的路由匹配是有优先级的:带有约束的路由(比如{Id:int}、{searchstring:alpha})会比无约束的路由优先级高,同时固定路径片段的路由也会优先于模糊匹配的路由。只要你的路由模板正确,就能避免匹配歧义。
内容的提问来源于stack exchange,提问作者Amol Vasaikar
相关产品推荐
相关产品推荐

