Строка запроса не работает при использовании маршрутизации атрибута

я используюSystem.Web.Http.RouteAttribute а такжеSystem.Web.Http.RoutePrefixAttribute включить чистые URL для моего приложения Web API 2. Для большинства моих запросов я могу использовать маршрутизацию (например,Controller/param1/param2) или я могу использовать строки запроса (например,Controller?param1=bob&param2=mary).

К сожалению, с одним из моих контроллеров (и только с одним) это не удается. Вот мой контроллер:

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

Когда я делаю запрос либо с использованием маршрутизации, оба работают нормально. Однако, если я использую строку запроса, она завершается неудачно, сообщая мне, что этот путь не существует.

Я попытался добавить следующее к моемуWebApiConfig.cs учебный класс'Register(HttpConfiguration config) функция (до и после маршрута по умолчанию), но она ничего не сделала:

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

Поэтому для ясности я хотел бы иметь возможность сделать это:

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

а также,

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

но, к сожалению, версии строки запроса не работают! :(

обновленный

Я полностью удалил второе действие и теперь пытаюсь использовать только единственное действие с необязательными параметрами. Я изменил свой атрибут маршрута на[Route("{name}/{drink}/{sport?}")] как Тони предложил сделать спорт обнуляемым, но это сейчас мешаетlocalhost:12345/1/Names/Ted/coke от того, чтобы быть действительным маршрутом по какой-то причине. Строки запроса ведут себя так же, как и раньше.

Обновление 2 Теперь у меня есть единственное действие в моем контроллере:

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

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

но, тем не менее, использование строк запроса не находит подходящий путь, в то время как использование метода маршрутизации делает.

Ответы на вопрос(8)

Ваш ответ на вопрос