Ajout d’une route d’action explicite au contrôleur API Web ASP.NET

J’ai un projet API Web ASP.NET avec ApiController qui fournit un sharepoint terminaison User avec les actions suivantes:

 GET /api/User POST /api/User DELETE /api/user 

Je veux fournir le point final suivant:

 GET /api/user/mesortingcs 

Cependant, lorsque je définis l’action du contrôleur comme suit:

 [HttpGet] public HttpResponseMessage Mesortingcs() { return null; } 

Je reçois les Multiple actions were found that match the request message d’erreur de Multiple actions were found that match the request .

Je comprends que cela viole la définition d’une API REST “pure”, mais c’est ce que je voudrais faire. J’imagine que je dois résoudre ce problème en mappant un itinéraire HTTP, mais j’ai essayé quelques itinéraires et je ne parviens pas à le faire fonctionner. À quoi ma route devrait-elle ressembler?

La route par défaut n’inclut pas l’action.

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

Il sélectionne les actions en fonction du contrôleur, du verbe HTTP et du paramètre ou de l’absence de paramètre dans l’itinéraire. Donc, il s’agit de trouver le bon contrôleur et de rechercher une action GET sans paramètre. Il en trouve deux.

Vous devez append un itinéraire supplémentaire incluant l’action. Ceci est fait soit avec un routage basé sur les atsortingbuts comme mentionné par Kiran, soit par un routage basé sur des conventions. Pour le routage basé sur des conventions, la route est généralement placée dans la méthode Application_start() de WebApiConfig.cs . Les itinéraires plus spécifiques vont avant les itinéraires généraux, afin que vos itinéraires ressemblent à ceci:

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

Si vous utilisez Web API 2, je suggérerais d’utiliser le routage d’atsortingbut, ce qui facilite l’expérience pour des scénarios comme celui-ci.

Vous pouvez continuer à utiliser l’itinéraire conventionnel par défaut pour la majorité de vos scénarios, mais vous pouvez également utiliser le routage d’atsortingbut aux endroits où vous devez, comme dans votre scénario actuel.

L’échantillon suivant illustre un scénario similaire:

http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/WebApiAtsortingbuteRoutingSample/WebApiAtsortingbuteRoutingSample/Controllers/Api/CustomersController.cs