La cadena de consulta no funciona mientras se usa el enrutamiento de atributos

Estoy usandoSystem.Web.Http.RouteAttribute ySystem.Web.Http.RoutePrefixAttribute para habilitar URL más limpias para mi aplicación Web API 2. Para la mayoría de mis solicitudes, puedo usar el enrutamiento (p. Ej.Controller/param1/param2) o puedo usar cadenas de consulta (p. ej.Controller?param1=bob&param2=mary)

Desafortunadamente, con uno de mis controladores (y solo uno), esto falla. Aquí está mi controlador:

[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...
    }
}

Cuando hago una solicitud para usar el enrutamiento, ambos funcionan bien. Sin embargo, si uso una cadena de consulta, falla, diciéndome que esa ruta no existe.

He intentado agregar lo siguiente a miWebApiConfig.cs clase'Register(HttpConfiguration config) función (antes y después de la ruta predeterminada), pero no hizo nada:

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

Entonces, para mayor claridad, me gustaría poder hacer esto:

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

y,

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

¡pero lamentablemente las versiones de cadena de consulta no funcionan! :(

Actualizado

Eliminé la segunda Acción por completo y ahora trato de usar solo una Acción singular con parámetros opcionales. He cambiado mi atributo de ruta a[Route("{name}/{drink}/{sport?}")] como Tony sugirió hacer que el deporte sea anulable, pero esto ahora evitalocalhost:12345/1/Names/Ted/coke de ser una ruta válida por alguna razón. Las cadenas de consulta se comportan de la misma manera que antes.

Actualización 2 Ahora tengo una acción singular en mi controlador:

[RoutePrefix("1/Names")]
public class NamesController : ApiController
{

    [HttpGet]
    [Route("{name}/{drink}/{sport?}")]
    public List<int> Get(string name, string drink, string sport = "")
    {
        // Code removed...
    }
}

pero aún así, el uso de cadenas de consulta no encuentra una ruta adecuada, mientras que el uso del método de enrutamiento sí.

Respuestas a la pregunta(8)

Su respuesta a la pregunta