Я не думаю, что вы даже можете скомпилировать свой код в ASP.NET Core Mvc 2.0
, поскольку у вас есть 2 действия, сопоставленные с одним и тем же маршрутом [HttGet] api/values
:
AmbiguousActionException: Multiple actions matched.
Помните, что ASP.NET Web API
использует HTTP-команду как часть запроса, чтобы определить, какое действие вызывать. Хотя он использует обычную маршрутизацию (вы называете свои действия Get, Post, Put и Delete и т. Д.), Если у вас нет атрибута маршрута, я настоятельно рекомендую всегда использовать атрибут маршрутизации для аннотирования ваших контроллеров и действий.
Время разработки API
Теперь вам как разработчику предстоит разработать маршрут. Помните, что маршрут должен быть Uri
, который может идентифицировать ресурс / ресурсы.
Используйте имя в качестве идентификатора вместе с маршрутом
[Route("api/[controller]")]
public class CustomersController : Controller
{
// api/customers
[HttpGet]
public IActionResult Get()
{
...
}
// api/customers/dave
[HttpGet("{name:alpha}")] // constraint as a string
public IActionResult GetByName(string name)
{
...
}
}
Используйте имя как фильтр для коллекции ресурсов
[Route("api/[controller]")]
public class CustomersController : Controller
{
// api/customers
// api/customers?name=dave
[HttpGet]
public IActionResult Get(string name)
{
...
}
}
Чтобы запутать вас больше
api/customers/dave
по-прежнему будет сначала выполнять GetById
!
[Route("api/[controller]")]
public class CustomersController : Controller
{
[HttpGet]
public IActionResult Get()
{
...
}
[HttpGet("{name}")]
public IActionResult GetByName(string name)
{
...
}
[HttpGet("{id}")]
public IActionResult GetById(int id)
{
...
}
}
Оба метода GetByName
и GetById
являются потенциальными кандидатами, но MVC сначала выбирает метод GetById
, потому что MVC сравнивает имя метода / шаблона {name}
и {id}
через сравнение строк без учета регистра, а i
предшествует n
.
Вот когда вы хотите наложить ограничения.
[Route("api/[controller]")]
public class CustomersController : Controller
{
[HttpGet]
public IActionResult Get()
{
...
}
// api/customers/dave
[HttpGet("{name:alpha}")]
public IActionResult GetByName(string name)
{
...
}
// api/customers/3
[HttpGet("{id:int}")]
public IActionResult GetById(int id)
{
...
}
}
Вы также можете указать Заказ!
[Route("api/[controller]")]
public class CustomersController : Controller
{
[HttpGet]
public IActionResult Get()
{
...
}
// api/customers/portland
[HttpGet("{city:alpha}", Order = 2)]
public IActionResult GetByCity(string city)
{
...
}
// api/customers/dave
[HttpGet("{name:alpha}", Order = 1)]
public IActionResult GetByName(string name)
{
...
}
// api/customers/3
[HttpGet("{id:int}")]
public IActionResult GetById(int id)
{
...
}
}
Без Order
метод GetByCity
будет предпочтительнее, чем GetByName
, потому что символ c из {city}
стоит перед символом n из {name}
. Но если вы укажете порядок, MVC выберет действие на основе Order
.
Вздох, пост слишком длинный ....
person
David Liang
schedule
10.10.2017