Ответ
Выбор действия (Action) — это процесс маршрутизации запросов (Routing), который сопоставляет входящий HTTP-запрос с исполняемым методом контроллера. Механизм работает на основе соглашений или, чаще, атрибутов маршрутизации.
Ключевые критерии сопоставления:
- HTTP-метод: Атрибуты
[HttpGet],[HttpPost],[HttpPut]и т.д. - Шаблон маршрута (Route Template): Определяется в
[Route("...")]на контроллере или действии. - Имя контроллера и действия (при использовании соглашений).
- Параметры запроса (из сегментов пути, строки запроса или тела).
Пример 1: Маршрутизация на основе атрибутов (рекомендуемый подход)
[ApiController]
[Route("api/[controller]")] // Базовый путь: /api/products
public class ProductsController : ControllerBase
{
// GET /api/products
[HttpGet]
public IActionResult GetAll() { /* ... */ }
// GET /api/products/5
[HttpGet("{id:int}")] // Ограничение типа параметра
public IActionResult GetById(int id) { /* ... */ }
// POST /api/products/search
[HttpPost("search")]
public IActionResult Search([FromBody] SearchFilter filter) { /* ... */ }
}
Пример 2: Соглашения (Convention-based routing) в Program.cs
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
// Запрос /Products/Details/3 будет направлен в ProductsController.Details(3)
Процесс выбора:
- Промежуточное ПО маршрутизации (
app.UseRouting()) анализирует URL запроса. - Создается набор кандидатов — действий, чьи шаблоны и HTTP-методы совпадают.
- Из кандидатов выбирается наиболее специфичное действие (с большим количеством сегментов и ограничений).
- Если найдено несколько одинаково специфичных действий, возникает
AmbiguousActionException. - После выбора действия выполняется привязка модели (Model Binding) для параметров.