Votre plan de route ressemble probablement à 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 l'itinéraire comme suit:
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional });
Notez que le routeTemplate inclut désormais une action. Beaucoup plus d'informations 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 cherchez, voici une autre prise de vue à ce sujet:
Vous n'avez peut-être pas besoin du paramètre action url et devez décrire le contenu que vous recherchez d'une autre manière. Puisque vous dites que les méthodes retournent des données de la même entité, laissez simplement les paramètres faire la description pour vous.
Par exemple, vos deux méthodes pourraient ê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'objet MyVm? Si vous pouvez simplement passer des variables via l'URI, je vous suggère de suivre cette voie. Sinon, vous devrez envoyer l'objet dans le corps de la demande et ce n'est pas très HTTP de vous lorsque vous faites un GET (cela fonctionne cependant, utilisez simplement [FromBody] en face de MyVm).
J'espère que cela illustre que vous pouvez avoir plusieurs méthodes GET dans un seul contrôleur sans utiliser le nom de l'action ou même l'attribut [HttpGet].
Mise à jour à partir de l'API Web 2.
Avec cette configuration d'API dans votre fichier WebApiConfig.cs:
Vous pouvez acheminer notre contrôleur comme ceci:
Où ControllerName est le nom de votre contrôleur (sans "contrôleur"). Cela vous permettra d'obtenir chaque action avec l'itinéraire détaillé ci-dessus.
Pour plus d'informations: http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2
la source
Dans l'API Web (par défaut), les méthodes sont choisies en fonction d'une combinaison de méthodes HTTP et de valeurs de route .
MyVm
ressemble à un objet complexe, lu par le formateur du corps, vous avez donc deux méthodes identiques en termes de données de route (car aucune d'entre elles n'a de paramètres de la route) - ce qui rend impossible pour le répartiteur (IHttpActionSelector
) de correspondre à la bonne .Vous devez les différencier par chaîne de requête ou par paramètre de route pour résoudre l'ambiguïté.
la source
Après de nombreuses recherches sur le Web et la recherche du formulaire de routage le plus approprié si vous avez trouvé ce qui suit
Ces mappages s'appliquent à la fois au mappage des noms d'actions et à la convention http de base (GET, POST, PUT, DELETE)
la source
Il est possible que vos méthodes Web soient résolues avec la même URL. Jetez un œil au lien suivant: -
http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api
Ainsi, vous devrez peut-être ajouter votre nom de méthode à votre table de routage.
la source
Sans utiliser d'actions, les options seraient:
déplacez l'une des méthodes vers un autre contrôleur, afin qu'elles ne s'affrontent pas.
utilisez une seule méthode qui prend le paramètre, et si elle est nulle, appelez l'autre méthode à partir de votre code.
la source
Cette solution a fonctionné pour moi.
Veuillez placer Route2 en premier 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 =>
Contrôleur =>
URL =>
la source
C'est la réponse pour tous ceux qui savent que tout est correct et qui a vérifié 50 fois .....
Assurez-vous que vous ne regardez pas à plusieurs reprises
RouteConfig.cs
.Le fichier que vous souhaitez modifier est nommé
WebApiConfig.cs
En outre, cela devrait probablement ressembler exactement à ceci:
J'aurais pu me sauver environ 3 heures.
la source
J'ai trouvé que lorsque j'ai deux méthodes Get, une sans paramètre et une avec un type complexe comme paramètre, j'ai eu 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 d'itinéraire. Ce qui suit a fonctionné pour moi.
Obtenez d'abord:
Deuxième get:
WebApiConfig:
la source
Cela est possible en raison de l'utilisation du contrôleur MVC au lieu du contrôleur API Web. Vérifiez l'espace de noms dans le contrôleur Web API, il devrait être comme suit
Si l'espace de noms est le suivant, il s'agit de l'erreur ci-dessus dans l'appel de la méthode du contrôleur web api
la source
Veuillez vérifier que vous disposez de deux méthodes qui ont un nom différent et les mêmes paramètres.
Si tel est le cas, supprimez l'une des méthodes et essayez.
la source
Je suis tombé sur ce problème en essayant d'augmenter mes contrôleurs WebAPI avec des actions supplémentaires.
Supposons que vous auriez
Il existe maintenant deux méthodes qui satisfont la demande de / api / controller qui déclenche le problème décrit par TS.
Je ne voulais pas ajouter de paramètres "factices" à mes actions supplémentaires, j'ai donc examiné les actions par défaut et j'ai trouvé:
pour la première méthode en combinaison avec la liaison de route "double":
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 nous permettant de séparer le routage des appels WebAPI "normaux" et les appels à l'action supplémentaire.
la source
Dans mon cas, tout allait bien
1) Web Config a été configuré correctement 2) Le préfixe de route et les attributs de route étaient corrects
J'obtenais toujours l'erreur. Dans mon cas, l'attribut "Route" (en appuyant sur F12) pointait vers System.Web.MVc mais pas System.Web.Http qui a causé le problème.
la source
Vous pouvez ajouter
[Route("api/[controller]/[action]")]
à votre classe de contrôleur.la source
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 que vous utilisez la bonne route, sinon cette erreur se produit.
la source
Assurez-vous de ne PAS décorer vos méthodes de contrôleur pour les actions par défaut GET | PUT | POST | DELETE avec l'attribut [HttpPost / Put / Get / Delete]. J'avais ajouté cet attribut à mon action de contrôleur Vanilla Post et cela a provoqué un 404.
J'espère que cela aide quelqu'un, car cela peut être très frustrant et interrompre les progrès.
la source
Par exemple => TestController
Si vous ne pouvez modifier que le fichier WebApiConfig.cs.
C'est tout :)
Et résultat:
la source
Avez-vous essayé comme:
la source
HttpGet
attribut n'a pas de constructeur qui accepte un argument de chaîne.