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

jul*_*nox 10 c# asp.net-mvc asp.net-web-api asp.net-web-api-routing asp.net-mvc-5

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

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

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

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

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

非常感谢

jd4*_*d4u 13

您需要定义方法访问名称,如

[HttpGet("User")]
public async Task<UserViewModel> GetByName(string name)
[HttpGet("User")]
public async Task<UserViewModel> GetByUserName(string name)

//You can access like 
//- api/Users/User?name=someneme
//- api/Users/User?username=someneme
Run Code Online (Sandbox Code Playgroud)

要么

[HttpGet("User")]
public async Task<UserViewModel> GetByAnyName(string name="", string username="")
//- api/Users/User?name=someneme
//- api/Users/User?username=someneme
//- api/Users/User?username=someneme&name=someone
Run Code Online (Sandbox Code Playgroud)

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

要么

[HttpGet("")]
public async Task<UserViewModel> GetAll()
[HttpGet("")]
public async Task<UserViewModel> Get(int id)
[HttpGet("")]
public async Task<UserViewModel> GetByName(string name)
[HttpGet("")]
public async Task<UserViewModel> GetByUserName(string name)

//You can access like 
//- api/Users/
//- api/Users/?id=123
//- api/Users/?name=someneme
//- api/Users/?username=someneme
Run Code Online (Sandbox Code Playgroud)