Abfragezeichenfolge funktioniert nicht, während Attributrouting verwendet wird

Ich bin mit System.Web.Http.RouteAttribute und System.Web.Http.RoutePrefixAttribute zu ermöglichen sauberere URLs für meine Web API 2 Anwendung. Für die meisten meiner Anfragen, die ich verwenden kann-routing (zB. Controller/param1/param2) oder ich kann verwenden Sie query-strings (zB. Controller?param1=bob&param2=mary).

Leider mit einem meiner Controller (und nur eine), diese schlägt fehl. Hier ist mein 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...
    }
}

Wenn ich eine Anfrage entweder über routing, funktionieren beide gut. Allerdings, wenn ich einen query-string, versäumt es, mir zu sagen, dass dieser Pfad nicht existiert.

Habe ich versucht, indem Sie das folgende zu meinem WebApiConfig.cs Klasse' Register(HttpConfiguration config) - Funktion (vor und nach der Default-route), aber es half nichts:

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+" });

Also für die Klarheit, ich möchte in der Lage sein, beides zu tun:

localhost:12345/1/Names/Ted/rugby/coke
localhost:12345/1/Names/Ted/coke

und

localhost:12345/1/Names?name=Ted&sport=rugby&drink=coke
localhost:12345/1/Names?name=Ted&drink=coke

aber leider ist der query-string-Versionen funktionieren nicht! 🙁

Aktualisiert

Habe ich entfernt, die zweite Aktion zusammen und versucht nun, die Verwendung von nur einer einzigartigen Aktion mit optionalen Parametern. Ich habe mich verändert meine route Attribut [Route("{name}/{drink}/{sport?}")] als Tony vorschlug, sport machen null-Werte zulässt, aber dies jetzt verhindert localhost:12345/1/Names/Ted/coke wird eine gültige route aus irgendeinem Grund. Query-strings sind gleich Verhalten wie zuvor.

Update 2
Ich habe jetzt eine einzigartige Aktion in meinem 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...
    }
}

aber immer noch, mithilfe von query strings nicht finden einen geeigneten Weg, während der Verwendung der routing-Methode.

InformationsquelleAutor der Frage Chris Paton | 2014-03-25

Schreibe einen Kommentar