Web API 2 / MVC 5:属性路由将参数作为查询字符串传递,以在同一控制器上定位不同的操作

我一直在使用新的Web API 2(看起来非常有前途)但我有点头疼让一些路由工作。 当我有GetAllUsers / GetUser(int id)时,一切正常,但是当我添加GetUserByName(字符串名称)和/或GetUserByUsername(字符串用户名)时,事情开始令人毛骨悚然。 我知道int将是第一个,我可以重新排序路线,但让我们想象下面的场景:

用户可以拥有有效的username=1234或者name=1234 (我知道它不太可能,但我们需要防止任何可能的情况)我们可能在数据库中有一个有效的1234 ID,并且所有路由都将被混淆。

也许这是我们需要在新的WebAPI 2上使用的东西,所以我想我可以带来一个“解决方法”,将filter作为查询字符串传递给同一个控制器中的不同操作,例如api/users/?username=1234 (GetUserByUsername)或api/users/?name=1234 (GetUserByName)

但我不能让查询字符串通过……实际上上面的任何查询字符串选项都被GetAllUsers捕获。

有没有人对这种情况有任何建议/解决方案?

非常感谢

您需要定义方法访问名称

 [HttpGet("User")] public async Task GetByName(string name) [HttpGet("User")] public async Task GetByUserName(string name) //You can access like //- api/Users/User?name=someneme //- api/Users/User?username=someneme 

要么

 [HttpGet("User")] public async Task GetByAnyName(string name="", string username="") //- api/Users/User?name=someneme //- api/Users/User?username=someneme //- api/Users/User?username=someneme&name=someone 

更新以上两者将与路由前缀的其他配置很好地协作。

要么

 [HttpGet("")] public async Task GetAll() [HttpGet("")] public async Task Get(int id) [HttpGet("")] public async Task GetByName(string name) [HttpGet("")] public async Task GetByUserName(string name) //You can access like //- api/Users/ //- api/Users/?id=123 //- api/Users/?name=someneme //- api/Users/?username=someneme