Контроллер Api, объявляющий более одного оператора Get

Использование нового Api Controller в MVC4, и я нашел проблему. Если у меня есть следующие методы:

public IEnumberable<string> GetAll()

public IEnumberable<string> GetSpecific(int i)

Это сработает. Однако, если я хочу получить некоторые разные данные другого типа, по умолчанию используется метод GetAll, даже если для параметра $.getJSON установлен метод GetAllIntegers:

public IEnumberable<int> GetAllIntergers()

(плохие соглашения об именах)

Возможно ли, чтобы я мог это сделать?

Можно ли использовать только один метод GetAll в контроллере Web API?

Мне кажется, что легче понять, чего я пытаюсь достичь. Вот фрагмент кода, чтобы показать, что я хотел бы сделать, в одном ApiController:

public IEnumerable<string> GetClients()
{ // Get data
}

public IEnumerable<string> GetClient(int id)
{ // Get data
}

public IEnumerable<string> GetStaffMember(int id)
{ // Get data
}

public IEnumerable<string> GetStaffMembers()
{ // Get data
}

Ответ 1

Это все в маршрутизации. Маршрут API по умолчанию выглядит следующим образом:

config.Routes.MapHttpRoute( 
    name: "API Default", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
);

При использовании шаблона маршрутизации по умолчанию Web API использует метод HTTP для выбора действия. В результате будет отображен запрос GET без параметров до первого GetAll, который он может найти. Чтобы обойти это, вам нужно определить маршрут, в который включено имя действия:

config.Routes.MapHttpRoute( 
   name: "ActionApi", 
   routeTemplate: "api/{controller}/{action}/{id}", 
   defaults: new { id = RouteParameter.Optional } 
);

После этого вы можете запускать запросы со следующими URL-адресами:

  • API/yourapicontroller/GetClients
  • API/yourapicontroller/GetStaffMembers

Таким образом, вы можете иметь несколько GetAll в контроллере.

Еще одна важная вещь в том, что с этим стилем маршрутизации вы должны использовать атрибуты для указания допустимых методов HTTP (например, [HttpGet]).

Существует также возможность смешивания маршрутизации по умолчанию, основанной на веб-API по умолчанию, с традиционным подходом, это очень хорошо описано здесь:

Ответ 2

Если кто-то сталкивается с этой проблемой. Вот как я это решил. Используйте атрибут [Маршрут] на вашем контроллере для перехода к определенному URL-адресу.

[Route("api/getClient")]
public ClientViewModel GetClient(int id)

[Route("api/getAllClients")]
public IEnumerable<ClientViewModel> GetClients()