ASP.NET WebApi – Plusieurs actions GET dans un contrôleur

J’ai le contrôleur d’ Users et le modèle REST de base fonctionne très bien. Cependant, j’ai besoin d’un users/{id}/usergroups modèle supplémentaire users/{id}/usergroups qui retournera tous les groupes d’utilisateurs pour cet utilisateur.

Quelle serait la meilleure façon de mettre cela en œuvre puisque j’imagine que j’aurai besoin de routes similaires sur de nombreux autres contrôleurs. Les valeurs par défaut ne suffisent pas …

Erreur

Plusieurs actions correspondant à la demande ont été trouvées: Api.Models.Users.User GetUser (Int32) sur le type Api.Controllers.UsersController System.Collections.Generic.IEnumerable`1 [Api.Models.Users.UserGroup] GetUserGroups (Int32) tapez Api.Controllers.UsersController

Code

 // GET api/Users public IEnumerable GetUsers() // GET api/Users/5 public User GetUser(int id) // THIS IS CONFLICT 1 // PUT api/Users/5 public HttpResponseMessage PutUser(int id, User user) // POST api/Users public HttpResponseMessage PostUser(User user) // DELETE api/Users/5 public HttpResponseMessage DeleteUser(int id) // GET api/Users/5/UserGroups public IEnumerable GetUserGroups(int id) // THIS IS CONFLICT 2 

Modifier 1

J’ai fait ce que suggéré amhed et cela ne résout pas le problème.

 // GET api/Users/5 [HttpGet, ActionName("getuser")] public User GetUser(int id) // THIS STILL DOES NOT WORK // GET api/Users/5/UserGroups [HttpGet, ActionName("usergroups")] public IEnumerable GetUserGroups(int id) // THIS WORKS // ROUTES config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "{controller}/{id}/{action}", defaults: new { id = RouteParameter.Optional, action = RouteParameter.Optional } ); 

Vous pouvez soit: simplement définir une méthode Get et avoir un paramètre Id optionnel comme ceci:

 public IEnumerable GetUsers(int? id){ if (id.HasValue) { //return collection of one item here } //return collection of all items here } 

Ou vous pouvez avoir plusieurs Gets décorés avec l’atsortingbut ActionName

 // GET api/Users [ActionName("GetAll")] public IEnumerable GetUsers() // GET api/Users/5 [ActionName("Get")] public User GetUser(int id) // THIS IS NO LONGER IN CONFLICT 

Et ensuite, définissez les itinéraires sur votre RouteConfig comme suit:

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

Je suis coincé en utilisant Web API v1 et suis venu avec la solution suivante à cela. Pour tous vos itinéraires généraux, déclarez le nom d’action comme “Par défaut”. Ensuite, dans votre configuration de route, définissez l’action par défaut = “Par défaut”. Cela modifie votre appel vers / Utilisateurs / 5 en utilisateurs / 5 / par défaut et garantit qu’il est mappé au bon endroit. Le seul problème que j’ai trouvé avec cette solution est que la documentation montrera la partie / Default de la route. Il semble que vous puissiez modifier votre vue pour exclure ces éléments, comme ce type l’a fait ( https://stackoverflow.com/a/29353198/4374666 ).

Si vous utilisez v2, il semble que le routage d’atsortingbuts serait le moyen le plus propre.

 // GET api/Users/5 [HttpGet, ActionName("Default")] public User GetUser(int id) // THIS STILL DOES NOT WORK // GET api/Users/5/UserGroups [HttpGet, ActionName("usergroups")] public IEnumerable GetUserGroups(int id) // THIS WORKS // ROUTES config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "{controller}/{id}/{action}", defaults: new { id = RouteParameter.Optional, action = "Default" } );