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&param2=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.
InformationsquelleAutor Chris Paton | 2014-03-25