我一直在玩新的Web API 2(这看起来非常有前途的btw),但是我有点头疼让一些路由工作.
当我有GetAllUsers / GetUser(int id)时,所有的工作都很好,但是当我添加GetUserByName(string name)和/或GetUserByUsername(string username)时,事情开始令人毛骨悚然.我知道int将是第一个,并且我可以重新排列路由,但是让我们想象下面的情况:
当我有GetAllUsers / GetUser(int id)时,所有的工作都很好,但是当我添加GetUserByName(string name)和/或GetUserByUsername(string username)时,事情开始令人毛骨悚然.我知道int将是第一个,并且我可以重新排列路由,但是让我们想象下面的情况:
用户可以拥有一个有效的用户名= 1234或者名称= 1234(我知道这不太可能,但是我们需要防止任何可能的情况),我们可能在数据库中有一个有效的1234 ID,所有的路由将被混合.
也许这是我们需要处理的新的WebAPI 2,所以我想我可以带来一个“解决方法”,通过过滤器作为查询字符串来定位同一个控制器中的不同操作,如api / users /?username = 1234 (GetUserByUsername)或api / users /?name = 1234(GetUserByName)
但是我无法使查询字符串进入…实际上,GetAllUsers抓到上面的任何querystring选项.
有没有人有任何建议/修复这种情况?
非常感谢
解决方法
您需要定义方法访问名称
[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
要么
[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
更新
以上两者都可以很好地与其他路由前缀配置工作.
要么
[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