Dans l'API Web, j'avais une classe de structure similaire:
public class SomeController : ApiController
{
[WebGet(UriTemplate = "{itemSource}/Items")]
public SomeValue GetItems(CustomParam parameter) { ... }
[WebGet(UriTemplate = "{itemSource}/Items/{parent}")]
public SomeValue GetChildItems(CustomParam parameter, SomeObject parent) { ... }
}
Comme nous pouvions mapper des méthodes individuelles, il était très simple d'obtenir la bonne demande au bon endroit. Pour une classe similaire qui n'avait qu'une seule GET
méthode mais aussi un Object
paramètre, j'ai utilisé avec succès IActionValueBinder
. Cependant, dans le cas décrit ci-dessus, j'obtiens l'erreur suivante:
Multiple actions were found that match the request:
SomeValue GetItems(CustomParam parameter) on type SomeType
SomeValue GetChildItems(CustomParam parameter, SomeObject parent) on type SomeType
J'essaie d'aborder ce problème en annulant la ExecuteAsync
méthode de ApiController
mais sans succès jusqu'à présent. Un conseil à ce sujet?
Edit: J'ai oublié de mentionner que j'essaie maintenant de déplacer ce code sur l'API Web ASP.NET qui a une approche différente du routage. La question est: comment faire fonctionner le code sur l'API Web ASP.NET?
c#
asp.net-web-api
paulius_l
la source
la source
Réponses:
C'est le meilleur moyen que j'ai trouvé pour prendre en charge des méthodes GET supplémentaires et prendre en charge les méthodes REST normales. Ajoutez les routes suivantes à votre WebApiConfig:
J'ai vérifié cette solution avec la classe de test ci-dessous. J'ai pu réussir chaque méthode de mon contrôleur ci-dessous:
J'ai vérifié qu'il prend en charge les demandes suivantes:
Notez que si vos actions GET supplémentaires ne commencent pas par «Get», vous souhaiterez peut-être ajouter un attribut HttpGet à la méthode.
la source
constraints: new{id=@"\d+"}
routes.MapHttpRoute("DefaultApiPut", "Api/{controller}", new {action = "Put"}, new {httpMethod = new HttpMethodConstraint(HttpMethod.Put)});
pour maPut
méthode, sinon cela me donnait 404.Allez de ceci:
Pour ça:
Par conséquent, vous pouvez maintenant spécifier à quelle action (méthode) vous souhaitez envoyer votre requête HTTP.
la publication sur "http: // localhost: 8383 / api / Command / PostCreateUser" appelle:
et la publication sur "http: // localhost: 8383 / api / Command / PostMakeBooking" appelle:
J'ai essayé cela dans une application de service API WEB auto-hébergée et cela fonctionne comme un charme :)
la source
[HttpGet]
,[HttpPost]
etc. attributs pour cartographier le verbe à la méthode.Je trouve que les attributs sont plus propres à utiliser que de les ajouter manuellement via le code. Voici un exemple simple.
Vous en avez également besoin dans votre webapiconfig
Quelques bons liens http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api Celui-ci explique mieux le routage. http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api
la source
config.MapHttpAttributeRoutes();
à monWebApiConfig.cs
, etGlobalConfiguration.Configuration.EnsureInitialized();
à la fin de maWebApiApplication.Application_Start()
méthode pour que les attributs de route fonctionnent.config.MapHttpAttributeRoutes();
doit apparaître avant la cartographie de l'itinéraire (par exemple avantconfig.Routes.MappHttpRoute(...
.Vous devez définir d'autres routes dans global.asax.cs comme ceci:
la source
Avec le nouveau Web Api 2, il est devenu plus facile d'avoir plusieurs méthodes d'obtention.
Si les paramètres passés aux
GET
méthodes sont suffisamment différents pour que le système de routage d'attributs distingue leurs types comme c'est le cas avecint
s etGuid
s, vous pouvez spécifier le type attendu dans l'[Route...]
attributPar exemple -
Pour plus de détails sur cette approche, voir ici http://nodogmablog.bryanhogan.net/2017/02/web-api-2-controller-with-multiple-get-methods-part-2/
Une autre option consiste à donner aux
GET
méthodes des itinéraires différents.Voir ici pour plus de détails - http://nodogmablog.bryanhogan.net/2016/10/web-api-2-controller-with-multiple-get-methods/
la source
Dans ASP.NET Core 2.0, vous pouvez ajouter l' attribut Route au contrôleur:
la source
J'essayais d'utiliser le routage d'attributs Web Api 2 pour autoriser plusieurs méthodes Get, et j'avais intégré les suggestions utiles des réponses précédentes, mais dans le contrôleur, j'avais seulement décoré la méthode "spéciale" (exemple):
... sans également placer un [RoutePrefix] en haut du Controller:
J'obtenais des erreurs indiquant qu'aucune route ne correspondait à l'URI soumis. Une fois que j'ai eu à la fois la [Route] décorant la méthode ainsi que [RoutePrefix] décorant le contrôleur dans son ensemble, cela a fonctionné.
la source
Je ne sais pas si vous avez trouvé la réponse, mais je l'ai fait et ça marche
Maintenant dans global.asx
la source
Avez-vous essayé de basculer vers WebInvokeAttribute et de définir la méthode sur "GET"?
Je crois que j'ai eu un problème similaire et je suis passé à dire explicitement quelle méthode (GET / PUT / POST / DELETE) est attendue sur la plupart, sinon la totalité, de mes méthodes.
Le WebGet devrait le gérer, mais j'ai vu qu'il avait des problèmes avec plusieurs Get beaucoup moins multiples Get du même type de retour.
[Modifier: rien de tout cela n'est valide avec le coucher du soleil de WCF WebAPI et la migration vers ASP.Net WebAPI sur la pile MVC]
la source
la source
L'alternative paresseuse / pressée (Dotnet Core 2.2):
Les appeler:
"bonjour42"
"monde99"
la source
Aucun des exemples ci-dessus n'a fonctionné pour mes besoins personnels. Voici ce que j'ai fini par faire.
Pour utiliser ce qui précède dans votre itinéraire, utilisez:
Ce qui se passe, c'est le genre de contrainte de faux dans la méthode afin que cette route ne corresponde qu'aux méthodes par défaut GET, POST, PUT et DELETE. Le "vrai" indique que nous voulons vérifier la correspondance des éléments du tableau. Si c'était faux, vous diriez exclure ceux dans la str Vous pouvez alors utiliser des routes au-dessus de cette méthode par défaut comme:
Dans ce qui précède, il recherche essentiellement l'URL suivante =>
http://www.domain.com/Account/Status/Active
ou quelque chose comme ça.Au-delà de ce qui précède, je ne suis pas sûr de devenir trop fou. En fin de compte, cela devrait être par ressource. Mais je vois le besoin de mapper des URL conviviales pour diverses raisons. Je suis convaincu qu'au fur et à mesure de l'évolution de l'API Web, il y aura une sorte de disposition. Si le temps le permet, je construirai une solution plus permanente et publierai.
la source
new System.Web.Http.Routing.HttpMethodConstraint(HttpMethod.Get, HttpMethod.Post, HttpMethod.Put, HttpMethod.Delete)
place.Impossible de faire fonctionner l'une des solutions de routage ci-dessus - une partie de la syntaxe semble avoir changé et je suis encore nouveau dans MVC - à la rigueur bien que j'ai mis en place ce hack vraiment horrible (et simple) qui me fera par pour l'instant - notez que cela remplace la méthode "public MyObject GetMyObjects (long id)" - nous changeons le type de "id" en une chaîne, et changeons le type de retour en object.
la source
Si vous avez plusieurs actions dans le même fichier, passez le même argument, par exemple Id à toutes les actions. C'est parce que l'action ne peut identifier que l'Id, donc au lieu de donner un nom à l'argument, déclarez uniquement l'Id comme ceci.
la source
Alternative simple
Utilisez simplement une chaîne de requête.
Routage
Manette
Demandes
Remarque
Gardez à l'esprit que le paramètre de la chaîne de requête ne doit pas être "id" ou quel que soit le paramètre dans la route configurée.
la source
Modifiez le WebApiConfig et ajoutez à la fin un autre Routes.MapHttpRoute comme ceci:
Ensuite, créez un contrôleur comme celui-ci:
Voilà comment je l'ai résolu. J'espère que cela aidera quelqu'un.
la source