Строка запроса не работает при использовании маршрутизации атрибута
я используюSystem.Web.Http.RouteAttribute
а такжеSystem.Web.Http.RoutePrefixAttribute
включить чистые URL для моего приложения Web API 2. Для большинства моих запросов я могу использовать маршрутизацию (например,Controller/param1/param2
) или я могу использовать строки запроса (например,Controller?param1=bob¶m2=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...
}
}
но, тем не менее, использование строк запроса не находит подходящий путь, в то время как использование метода маршрутизации делает.