Chaîne de requête ne fonctionne pas lors de l'utilisation de l'attribut de routage
Je suis en utilisant System.Web.Http.RouteAttribute
et System.Web.Http.RoutePrefixAttribute
pour permettre à plus propre Url de mon site Web API 2 de la demande. Pour la plupart de mes demandes, je peux utiliser le routage (par exemple. Controller/param1/param2
) ou je peux utiliser des chaînes de requête (par exemple. Controller?param1=bob¶m2=mary
).
Malheureusement, avec l'un de mes Contrôleurs (et un seul), il échoue. Voici mon Controller:
[RoutePrefix("1/Names")]
public class NamesController : ApiController
{
[HttpGet]
[Route("{name}/{sport}/{drink}")]
public List<int> Get(string name, string sport, string drink)
{
//Code removed...
}
[HttpGet]
[Route("{name}/{drink}")]
public List<int> Get(string name, string drink)
{
//Code removed...
}
}
Quand je fais une demande soit à l'aide de routage, à la fois, beau travail. Cependant, si j'utilise une chaîne de requête, il ne parvient pas, en me disant que ce chemin n'existe pas.
J'ai essayé d'ajouter ce qui suit à mon WebApiConfig.cs
de la classe de Register(HttpConfiguration config)
fonction (avant et après la route par Défaut), mais il n'a rien fait:
config.Routes.MapHttpRoute(
name: "NameRoute",
routeTemplate: "{verId}/Names/{name}/{sport}/{drink}",
defaults: new { name = RouteParameter.Optional, sport = RouteParameter.Optional, drink = RouteParameter.Optional },
constraints: new { verId = @"\d+" });
Donc, pour plus de clarté, je voudrais être capable de faire les deux ce:
localhost:12345/1/Names/Ted/rugby/coke
localhost:12345/1/Names/Ted/coke
et,
localhost:12345/1/Names?name=Ted&sport=rugby&drink=coke
localhost:12345/1/Names?name=Ted&drink=coke
mais, malheureusement, la chaîne de requête versions ne fonctionnent pas! 🙁
Mis à jour
J'ai enlevé la deuxième Action tout à fait et essaie maintenant d'utiliser juste un singulier Action avec des paramètres optionnels. J'ai changé mon itinéraire attribut [Route("{name}/{drink}/{sport?}")]
que Tony a suggéré de faire du sport nullable, mais cela empêche maintenant localhost:12345/1/Names/Ted/coke
d'être valide route pour une raison quelconque. Les chaînes de requête se comportent de la même façon qu'avant.
Mise à jour 2
J'ai maintenant un singulier action dans mon controller:
[RoutePrefix("1/Names")]
public class NamesController : ApiController
{
[HttpGet]
[Route("{name}/{drink}/{sport?}")]
public List<int> Get(string name, string drink, string sport = "")
{
//Code removed...
}
}
mais encore, à l'aide de chaînes de requête n'est pas de trouver un chemin d'accès approprié, tout en utilisant la méthode de routage n'.
- Cela vous fera économiser des heures de frustration. nuget.org/packages/routedebugger/2.1.4
- Nice, je vais vérifier cela ainsi
- Merci pour le pointeur @IanP. Malheureusement, si il ne trouve pas le chemin, il ne peut pas vous dire quelle route il utilise. Utile de l'outil que je ne connaissais pas bien! Je pense Aperçu fait quelque chose de similaire.
Vous devez vous connecter pour publier un commentaire.
J'ai été confronté à la même question de " Comment inclure les paramètres de recherche comme une chaîne de requête?', alors que j'essayais de construire une api web pour mon projet actuel. Après recherche sur google, le suivant fonctionne bien pour moi:
Api contrôleur de l'action:
L'url que j'ai essayé par le biais de facteur:
[Route()]
de l'attribut moyen de l'URI/PD/search?
ce qui est acceptable. N'oubliez pas il n'y a pas de "REPOS" ou la spécification et de la marge de manœuvre est donnée.Après beaucoup de laborieux tripoter et Googler, je suis venu avec un "fix". Je ne sais pas si c'est idéal/les meilleures pratiques/plaine tort, mais elle n'en résout mon problème.
Que je n'ai fait ajouter
[Route("")]
en plus de la route attributs, j'étais déjà à l'aide. Cela permet essentiellement de l'API Web 2 de routage afin de permettre les chaînes de requête, comme c'est maintenant valide Route.Un exemple serait maintenant:
Cela fait deux
localhost:12345/1/Names/Ted/coke
etlocalhost:12345/1/Names?name=Ted&drink=coke
valide.Avec l'Attribut de routage, vous devez spécifier les valeurs par défaut de sorte qu'ils seraient en option.
L'attribution d'une valeur permettra de l'option de sorte que vous n'avez pas à inclure et il va passer la valeur à spécifier.
Je n'ai pas testé la chaîne de requête pour cela, mais il devrait fonctionner de la même.
Je viens de relire la question et je vois que vous avez 2 Obtenir les verbes avec le même chemin, je crois que ce serait la cause d'un conflit, comme le routage ne sais pas lequel utiliser, peut-être à l'aide de l'option paramètres de l'aide. Vous pouvez également spécifier une valeur null et faire la vérification de la méthode sur la façon de procéder.
Puis vérifier les variables de la méthode pour voir si ils sont nuls et de gérer en tant que de besoin.
Espère que cette aide, certains? lol
Si peut-être pas ce site, il a plus de détails sur l'attribut de routage.
http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2
Clip à partir de ce site:
Juste une remarque de ma part ainsi. Pour queryString params de travail, vous devez fournir un valeur par défaut de vos paramètres de méthode pour le rendre facultatif. Juste comme vous le faites lorsque vous normalement l'invocation d'une méthode C#.
Cela me permet d'appeler le point de terminaison comme ceci:
À l'aide de
Route("search/{categoryid=categoryid}/{ordercode=ordercode}")
va vous permettre d'utiliser à la fois Querystrings et en ligne les paramètres de la route comme répondu par mosharaf hossain. L'écriture de cette réponse, comme ce devrait être la priorité de réponse, et le meilleur moyen. À l'aide deRoute("")
va causer des problèmes si vous avez plusieurs get/Put/Posts/Supprime.Voici une légère déviants de @bhargav kishore mummadireddy de l' réponse, mais une déviation importante. Sa réponse sera, par défaut, la chaîne de requête valeurs à une valeur non vide. Cette réponse par défaut à vide.
Il vous permet d'appeler le contrôleur à travers le chemin de routage, ou à l'aide de la chaîne de requête. Essentiellement, il définit la valeur par défaut de la chaîne de requête à vide, ce qui signifie qu'il sera toujours acheminée.
C'était important pour moi, parce que je veux retourner 400 (Bad Request) si une requête n'est pas spécifié, plutôt que d'avoir ASP.NET de retour à la "impossible de localiser cette méthode sur le contrôleur d'erreur".
Puisque vous avez
[Route("{name}/{drink}/{sport?}")]
comme attribut de routage, ce code ne sera jamais frappé.Donc uniquement l'attribut route
[Route("{name}/{drink}/{sport?}")]
va être honorée ici. Depuis votre demandelocalhost:12345/1/Names?name=Ted&sport=rugby&drink=coke
, n'a pas de nom, de sport ou de boire dans l'URL, il ne va pas correspondre à cet attribut la route. Nous ne considérons pas les paramètres de chaîne de requête lors de l'appariement des routes.Pour résoudre ce problème, vous devez faire tous les 3 en option dans votre attribut de la route. Puis elle correspond à la demande.
- Je utiliser FromUri attribut comme solution