Web API 2/MVC 5: атрибут Маршрутизация передаёт параметры в качестве последовательности запросов для разных действий на одном контроллере

Я играю с новым Web API 2 (который выглядит очень многообещающе), но у меня немного головная боль, чтобы работать с некоторыми маршрутами. Все работает отлично, когда у меня есть GetAllUsers/GetUser (int id), но тогда, когда я добавляю GetUserByName (имя строки) и/или GetUserByUsername (имя пользователя строки), все становится жутким. Я знаю, что int будет первым и что я могу повторно заказать маршруты, но представьте себе следующий сценарий:

Пользователь может иметь действительный username=1234 или name=1234 (я знаю, что это маловероятно, но нам нужно предотвратить любую возможную ситуацию), и у нас может быть действительный 1234 ID в базе данных, и все маршруты будут замешаны.

Возможно, это то, что нам нужно будет работать с новым WebAPI 2, поэтому я подумал, что могу использовать фильтры "обходного пути" в качестве querystrings для задания разных действий в одном контроллере, например api/users/?username=1234 (GetUserByUsername ) или api/users/?name=1234 (GetUserByName)

Но я не могу сделать querystrings, чтобы пройти через... на самом деле любая опция querystring выше попадает в GetAllUsers.

Есть ли у кого-нибудь предложение/исправление для этого сценария?

Спасибо большое

Ответ 1

Вам нужно определить имя доступа к методу, например

[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