Je commence à utiliser le projet d'API Web MVC4, j'ai un contrôleur avec plusieurs HttpPost
méthodes. Le contrôleur ressemble à ce qui suit:
Manette
public class VTRoutingController : ApiController
{
[HttpPost]
public MyResult Route(MyRequestTemplate routingRequestTemplate)
{
return null;
}
[HttpPost]
public MyResult TSPRoute(MyRequestTemplate routingRequestTemplate)
{
return null;
}
}
Ici MyRequestTemplate
représente la classe de modèle responsable de la gestion du Json passant par la requête.
Erreur:
Lorsque je fais une demande en utilisant Fiddler pour http://localhost:52370/api/VTRouting/TSPRoute
ou http://localhost:52370/api/VTRouting/Route
j'obtiens une erreur:
Plusieurs actions correspondant à la demande ont été trouvées
Si je supprime l'une des méthodes ci-dessus, cela fonctionne bien.
Global.asax
J'ai essayé de modifier la table de routage par défaut dans global.asax
, mais j'obtiens toujours l'erreur, je pense que j'ai un problème pour définir les routes dans global.asax. Voici ce que je fais dans global.asax.
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapHttpRoute(
name: "MyTSPRoute",
routeTemplate: "api/VTRouting/TSPRoute",
defaults: new { }
);
routes.MapHttpRoute(
name: "MyRoute",
routeTemplate: "api/VTRouting/Route",
defaults: new { action="Route" }
);
}
Je fais la demande dans Fiddler en utilisant POST, en passant json dans RequestBody pour MyRequestTemplate.
Une bien meilleure solution à votre problème serait d'utiliser
Route
ce qui vous permet de spécifier l'itinéraire sur la méthode par annotation:la source
Route
etTSPRoute
?utilisation:
ce n'est plus une approche RESTful, mais vous pouvez maintenant appeler vos actions par leur nom (plutôt que de laisser l'API Web en déterminer automatiquement une pour vous en fonction du verbe) comme ceci:
Contrairement à la croyance populaire, il n'y a rien de mal à cette approche et elle n'abuse pas de l'API Web. Vous pouvez toujours tirer parti de toutes les fonctionnalités impressionnantes de l'API Web (gestionnaires de délégation, négociation de contenu, formateurs de types de médias, etc.) - vous abandonnez simplement l'approche RESTful.
la source
Un point de terminaison d'API Web (contrôleur) est une ressource unique qui accepte les verbes get / post / put / delete. Ce n'est pas un contrôleur MVC normal.
Nécessairement,
/api/VTRouting
il ne peut y avoir qu'une seule méthode HttpPost qui accepte les paramètres que vous envoyez. Le nom de la fonction n'a pas d'importance , tant que vous décorez avec le truc [http]. Je n'ai jamais essayé, cependant.Edit: cela ne fonctionne pas. En résolvant, il semble aller par le nombre de paramètres, sans essayer de lier le modèle au type.
Vous pouvez surcharger les fonctions pour accepter différents paramètres. Je suis à peu près sûr que tout irait bien si vous le déclariez comme vous le faites, mais que vous utilisiez des paramètres différents (incompatibles) avec les méthodes. Si les paramètres sont les mêmes, vous n'avez pas de chance car la liaison de modèle ne saura pas laquelle vous vouliez dire.
Cette partie fonctionne
Le modèle par défaut qu'ils donnent lorsque vous en créez un nouveau rend cela assez explicite, et je dirais que vous devriez vous en tenir à cette convention:
Si vous voulez créer une classe qui fait beaucoup de choses, pour une utilisation ajax, il n'y a pas de grande raison de ne pas utiliser un modèle de contrôleur / action standard. La seule vraie différence est que vos signatures de méthode ne sont pas aussi jolies et que vous devez encapsuler les choses
Json( returnValue)
avant de les renvoyer.Éditer:
La surcharge fonctionne très bien lors de l'utilisation du modèle standard (modifié pour inclure) lors de l'utilisation de types simples. Je suis allé tester l'autre manière aussi, avec 2 objets personnalisés avec des signatures différentes. Je n'ai jamais pu le faire fonctionner.
Cela a fonctionné pour moi dans ce cas, voyez où cela vous mène. Exception pour les tests uniquement.
Et appelé comme ça de la console:
la source
Il est possible d'ajouter plusieurs méthodes Get et Post dans le même contrôleur API Web. Ici, la route par défaut est à l'origine du problème. L'API Web vérifie la correspondance d'itinéraire de haut en bas et, par conséquent, vos correspondances d'itinéraire par défaut pour toutes les demandes. Selon la route par défaut, une seule méthode Get et Post est possible dans un contrôleur. Placez le code suivant en haut ou Commenter / Supprimer l'itinéraire par défaut
la source
Mettez Route Prefix [RoutePrefix ("api / Profiles")] au niveau du contrôleur et mettez une route à la méthode d'action [Route ("LikeProfile")]. Pas besoin de changer quoi que ce soit dans le fichier global.asax
la source
Je pense que la question a déjà reçu une réponse. Je cherchais également quelque chose d'un contrôleur webApi qui a les mêmes mehtods signaturés mais des noms différents. J'essayais d'implémenter la calculatrice en tant que WebApi. La calculatrice a 4 méthodes avec la même signature mais des noms différents.
et dans le fichier WebApiConfig que vous avez déjà
Définissez simplement l'authentification / l'autorisation sur IIS et vous avez terminé!
J'espère que cela t'aides!
la source
Vous pouvez utiliser cette approche:
la source
Je ne sais pas si la surcharge de la méthode get / post viole le concept d'API restfull, mais cela fonctionne. Si quelqu'un aurait pu éclairer sur cette question. Et si j'ai un uri comme
donc comme vous pourriez voir mon journal une sorte d'agrégatoot, bien que je puisse définir un autre contrôleur pour la publication uniquement et passer le numéro d'identification de la publication dans mon URL, mais cela donne beaucoup plus de sens. puisque ma publication n'existerait pas sans la revue elle-même.
la source
Je viens d'ajouter "action = action_name" à l'url et de cette façon le moteur de routage sait quelle action je veux. J'ai également ajouté l'attribut ActionName aux actions mais je ne suis pas sûr qu'il soit nécessaire.
la source
La meilleure et la plus simple explication que j'ai vue sur ce sujet - http://www.binaryintellect.net/articles/9db02aa1-c193-421e-94d0-926e440ed297.aspx
Je l'ai fait fonctionner uniquement avec Route, et je n'avais pas besoin de RoutePrefix.
Par exemple, dans le contrôleur
et
Ensuite, le nom de la fonction entre dans jquery soit -
ou
la source