Plusieurs actions correspondant à la requête ont été trouvées dans Web Api

Je continue à avoir cette erreur lorsque j’essaie d’avoir 2 méthodes “Get”

Plusieurs actions correspondant à la requête ont été trouvées: webapi

J’ai regardé les autres questions similaires à ce sujet sur la stack mais je ne comprends pas.

J’ai 2 noms différents et utilise l’atsortingbut “HttpGet”

[HttpGet] public HttpResponseMessage Summary(MyVm vm) { return null; } [HttpGet] public HttpResponseMessage FullDetails() { return null; } 

Votre carte d’itinéraire est probablement quelque chose comme ceci:

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

Mais pour avoir plusieurs actions avec la même méthode http, vous devez fournir à webapi plus d’informations via la route comme ceci:

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

Notez que la routeTemplate inclut maintenant une action. Beaucoup plus d’infos ici: http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

Mettre à jour:

Bon, maintenant que je pense que je comprends ce que vous êtes après, voici une autre prise à ceci:

Vous n’avez peut-être pas besoin du paramètre url d’action et devez décrire le contenu que vous recherchez d’une autre manière. Puisque vous dites que les méthodes renvoient des données de la même entité, laissez simplement les parameters faire la description pour vous.

Par exemple, vos deux méthodes peuvent être transformées en:

 public HttpResponseMessage Get() { return null; } public HttpResponseMessage Get(MyVm vm) { return null; } 

Quel type de données transmettez-vous dans l’object MyVm? Si vous pouvez simplement passer des variables via l’URI, je vous suggère de suivre cette voie. Sinon, vous devrez envoyer l’object dans le corps de la requête et ce n’est pas très HTTP de votre part lorsque vous effectuez un GET (cela fonctionne cependant, utilisez simplement [FromBody] en face de MyVm).

J’espère que cela montre que vous pouvez avoir plusieurs méthodes GET dans un seul contrôleur sans utiliser le nom de l’action ou même l’atsortingbut [HttpGet].

Mise à jour depuis Web API 2.

Avec cette configuration API dans votre fichier WebApiConfig.cs:

 public static void Register(HttpConfiguration config) { //// Web API routes config.MapHttpAtsortingbuteRoutes(); //Don't miss this config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = System.Web.Http.RouteParameter.Optional } ); } 

Vous pouvez router notre contrôleur comme ceci:

 [Route("api/ControllerName/Summary")] [HttpGet] public HttpResponseMessage Summary(MyVm vm) { rturn null; } [Route("api/ControllerName/FullDetails")] [HttpGet] public HttpResponseMessage FullDetails() { return null; } 

Où ControllerName est le nom de votre contrôleur (sans “controller”). Cela vous permettra d’obtenir chaque action avec l’itinéraire détaillé ci-dessus.

Pour en savoir plus: http://www.asp.net/web-api/overview/web-api-routing-and-actions/atsortingbute-routing-in-web-api-2

Dans Web API (par défaut), les méthodes sont choisies en fonction d’une combinaison de méthodes HTTP et de valeurs d’itinéraire .

MyVm ressemble à un object complexe, lu par le formateur du corps, de sorte que vous avez deux méthodes identiques en termes de données de route (car aucun des deux n’a de parameters de la route) – ce qui rend impossible le répartiteur ( IHttpActionSelector ) appropriée.

Vous devez les différencier par une chaîne de requête ou un paramètre de route pour résoudre les ambiguïtés.

Après beaucoup de recherches sur le Web et d’essayer de trouver le formulaire le plus approprié pour la carte de routage si ont trouvé ce qui suit

 config.Routes.MapHttpRoute("DefaultApiWithId", "Api/{controller}/{id}", new { id =RouteParameter.Optional }, new { id = @"\d+" }); config.Routes.MapHttpRoute("DefaultApiWithAction", "Api/{controller}/{action}"); 

Ces mappages s’appliquent à la fois au mappage des noms d’actions et aux conventions http de base (GET, POST, PUT, DELETE)

Il est possible que vos méthodes Web soient résolues sur la même URL. Regardez le lien suivant: –

http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

Vous devrez donc peut-être append votre nom de méthode à votre table de routage.

Sans utiliser les actions, les options seraient les suivantes:

  1. déplacez l’une des méthodes vers un autre contrôleur afin qu’elles ne se heurtent pas.

  2. Utilisez juste une méthode qui prend le paramètre, et si elle est nulle, appelez l’autre méthode à partir de votre code.

J’ai constaté que lorsque j’ai deux méthodes Get, l’une sans paramètre et l’autre avec un type complexe en tant que paramètre, j’ai la même erreur. J’ai résolu ce problème en ajoutant un paramètre factice de type int, nommé Id, comme premier paramètre, suivi de mon paramètre de type complexe. J’ai ensuite ajouté le paramètre de type complexe au modèle de route. Ce qui suit a fonctionné pour moi.

Premièrement, obtenez:

 public IEnumerable Get() { ... } 

Deuxième get:

 public IEnumerable Get(int id, [FromUri] List layers) { ... } 

WebApiConfig:

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

S’il vous plaît vérifiez que vous avez deux méthodes qui ont le nom différent et les mêmes parameters.

Si c’est le cas, supprimez l’une des méthodes et essayez.

Je suis tombé sur ce problème en essayant d’augmenter mes contrôleurs WebAPI avec des actions supplémentaires.

Supposons que vous auriez

 public IEnumerable Get() { return this.Repository.GetAll(); } [HttpGet] public void ReSeed() { // Your custom action here } 

Il existe maintenant deux méthodes qui répondent à la demande de / api / controller, ce qui déclenche le problème décrit par TS.

Je ne voulais pas append de parameters “factices” à mes actions supplémentaires, j’ai donc examiné les actions par défaut et proposé:

 [ActionName("builtin")] public IEnumerable Get() { return this.Repository.GetAll(); } 

pour la première méthode en combinaison avec la liaison “dual”:

 config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { action = "builtin", id = RouteParameter.Optional }, constraints: new { id = @"\d+" }); config.Routes.MapHttpRoute( name: "CustomActionApi", routeTemplate: "api/{controller}/{action}"); 

Notez que même s’il n’y a pas de paramètre “action” dans le premier modèle de route, vous pouvez toujours configurer une action par défaut permettant de séparer le routage des appels WebAPI “normaux” et les appels à l’action supplémentaire.

Cela est possible grâce à l’utilisation du contrôleur MVC au lieu du contrôleur API Web. Vérifiez l’espace de noms dans le contrôleur d’API Web qu’il devrait être comme suit

 using System.Net; using System.Net.Http; using System.Web.Http; 

Si l’espace de nommage est comme suit, alors l’erreur ci-dessus se produit dans l’appel de la méthode du contrôleur Web Api

 using System.Web; using System.Web.Mvc; 

Cette solution a fonctionné pour moi.

Veuillez d’abord placer Route2 dans WebApiConfig. Ajoutez également HttpGet et HttpPost avant chaque méthode et incluez le nom du contrôleur et le nom de la méthode dans l’URL.

WebApiConfig =>

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

Contrôleur =>

 public class ValuesController : ApiController { [HttpPost] public ssortingng GetCustomer([FromBody] RequestModel req) { return "Customer"; } [HttpPost] public ssortingng GetCustomerList([FromBody] RequestModel req) { return "Customer List"; } } 

Url =>

 http://localhost:7050/api/Values/GetCustomer http://localhost:7050/api/Values/GetCustomerList 

Je sais que c’est une vieille question, mais parfois, lorsque vous utilisez des ressources de service comme AngularJS pour vous connecter à WebAPI, assurez-vous d’utiliser la bonne route, sinon cette erreur se produit.

Assurez-vous de ne pas décorer vos méthodes Controller pour les actions GET | PUT | POST | DELETE par défaut avec l’atsortingbut [HttpPost / Put / Get / Delete]. J’avais ajouté cet atsortingbut à mon action sur le Van Post Poster et cela provoquait un 404.

J’espère que cela aidera quelqu’un, car cela peut être très frustrant et freiner les progrès.