type framework c# asp.net-mvc-4 asp.net-web-api asp.net-routing

c# - framework - web api response type



Controlador Api que declara más de una declaración Get (2)

Usando el nuevo Controlador Api en MVC4, y encontré un problema. Si tengo los siguientes métodos:

public IEnumberable<string> GetAll()

public IEnumberable<string> GetSpecific(int i)

Esto funcionará Sin embargo, si deseo recuperar algunos datos diferentes de un tipo diferente, se GetAll predeterminada el método GetAll , aunque $.getJSON está establecido en el método GetAllIntegers :

public IEnumberable<int> GetAllIntergers()

(malas convenciones de nombres)

¿Es posible para mí poder hacer esto?

¿Puedo tener solo un solo método GetAll en el controlador de la API web?

Creo que es más fácil visualizar lo que intento lograr. Aquí hay un fragmento de código para mostrar lo que me gustaría poder hacer, en un solo 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 }


En caso de que alguien más se enfrenta a este problema. Así es como resolví esto. Use el atributo [Ruta] en su controlador para enrutar a una url específica.

[Route("api/getClient")] public ClientViewModel GetClient(int id) [Route("api/getAllClients")] public IEnumerable<ClientViewModel> GetClients()


Esto está todo en la ruta. La ruta predeterminada de la API web se ve así:

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

Con la plantilla de enrutamiento predeterminada, la API web usa el método HTTP para seleccionar la acción. Como resultado, asignará una solicitud GET sin parámetros al primer GetAll que pueda encontrar. Para evitar esto, necesita definir una ruta donde se incluye el nombre de la acción:

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

Después de eso, puede realizar las solicitudes con las siguientes URL:

  • api / yourapicontroller / GetClients
  • api / yourapicontroller / GetStaffMembers

De esta forma puede tener GetAll múltiple en el controlador.

Una cosa más importante aquí es que con este estilo de enrutamiento, debe usar atributos para especificar los métodos HTTP permitidos (como [HttpGet]).

También existe la opción de mezclar el enrutamiento basado en verbos predeterminado de la API Web con el enfoque tradicional, que se describe muy bien aquí: