Web Api Get Overload Throws Было найдено несколько действий, соответствующих запросу

У меня есть контроллер API:

[RoutePrefix("api/users")]
[Authorize]
public class UsersController : ApiController

который имеет два метода Get:

[HttpGet]
[Route("")]
public async Task<HttpResponseMessage> Get(ODataQueryOptions<ApplicationUser> options)
{
        return Request.CreateResponse(HttpStatusCode.OK, new List<ApplicationUser>());
}

[HttpGet]
[Route("")]
public async Task<HttpResponseMessage> Get()
{
        return Request.CreateResponse(HttpStatusCode.OK, new List<ApplicationUser>());
}

Звонок http://mysite/api/users?$filter=FirstName eq 'George' или звонок http://mysite/api/users

вызывает исключение Было найдено несколько действий, соответствующих запросу.

Комментирование любого метода приведет к тому, что другой будет работать.

Любая помощь будет оценена по достоинству.


person Paul Speranza    schedule 28.02.2015    source источник


Ответы (1)


Вся маршрутизация веб-API заключается в преобразовании url в controller/action. И его отображение должно быть однозначным.

В случае, если у нас будет только первый actionGet(ODataQueryOptions<ApplicationUser> options), он будет соответствовать обоим URL-адресам ниже:

http://mysite/api/users?$filter=FirstName+eq+'George' 
http://mysite/api/users

Первый URL будет преобразован в вызов Get(someODataValue), второй может быть Get(null)

То же самое можно применить ко второму методу Get() без параметров, потому что оба URL будут преобразованы в вызов без параметров Get() (часть OData будет пропущена)

Таким образом, решение обычно должно быть в двух методах, которые действительно уникальны по параметрам. Например. один - объект/ссылка, второй - valueType/int

[HttpGet]
public async Task<HttpResponseMessage> Get(ODataQueryOptions<ApplicationUser> options)
{ ... }

[HttpGet]
public async Task<HttpResponseMessage> Get(int id)
{ ... }
person Radim Köhler    schedule 28.02.2015
comment
Так что, если я хочу получить все без параметров? Просто не передать варианты? Если да, то удовлетворит ли это гуру REST? - person Paul Speranza; 28.02.2015
comment
No param... значит дайте мне список всего (ну что-то в этом роде ;). Param INT Id означает ПОЛУЧИТЬ один элемент с предоставленным ключом... Param as OData... означает дать мне список, но с этими ограничениями ($filter,$orderby...) Гуру REST понравится, потому что так оно и задумано ;) Пожалуйста, ознакомьтесь с приведенной здесь таблицей: en.wikipedia.org/wiki/Representational_state_transfer#Example< /а> - person Radim Köhler; 28.02.2015