Я использую 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
class '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...
}
}
но все же использование строк запроса не находит подходящего пути, в то время как использование метода маршрутизации делает.