Вопрос по asp.net-routing, asp.net-mvc-4, c#, asp.net-web-api – Контроллер Api, объявляющий более одного оператора Get

42

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

public IEnumberable<string> GetAll()

public IEnumberable<string> GetSpecific(int i)

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

public IEnumberable<int> GetAllIntergers()

(bad naming conventions)

Могу ли я сделать это?

Могу ли я иметь только одинGetAll метод в контроллере Web API?

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

<code>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
}
</code>

Ваш Ответ

2   ответа
63

им образом:

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]).

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

Web API: Mixing Traditional & Verb-Based Routing
Быстрый вопрос, могу ли я так маршрутизировать и при этом вызывать только мои методы & quot; Post & quot; и они автоматически принимают HttpPost, только если я включаю атрибут ActionNameAttribute?
@uriDium Похоже, вы ищете для смешивания традиционных & amp; маршрутизация на основе глаголов, вы можете прочитать об этом здесь:blog.appliedis.com/2013/03/25/…
@ Si8 Пожалуйста, предоставьте более подробную информацию или свяжитесь со мной по электронной почте - я постараюсь помочь.
У меня возникли некоторые проблемы с маршрутизацией - я могу определить несколько & quot; GET & quot; методы, но если я нажму / api / {controller}, сервер выдаст HTTP 500 «найдено несколько действий» а не 404. Есть идеи, как это заблокировать? Мне бы хотелось, чтобы / api / {controller} / {id} направлялся к & quot; Get, Post, Put, Delete и т. Д. & Quot ;, затем имел / api / {controller} / {id} / {action} маршрут к определенному действию, например / api / Customers / 5 / Products. Не работает - все дает "найдено несколько действий" ошибка.
@Alxandr Вам все равно придется использовать AcceptVerbsAttribute (или HttpPostAttribute, HttpGetAttribute и т. Д.)
9

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

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

[Route("api/getAllClients")]
public IEnumerable<ClientViewModel> GetClients()
Ссылка атрибута маршрута для тех, кто еще более заинтересован в том, что это за формат:docs.microsoft.com/en-us/aspnet/web-api/overview/…

Похожие вопросы