Как в ASP.NET Core определяется, какой Action контроллера использовать для обработки входящего HTTP-запроса?

«Как в ASP.NET Core определяется, какой Action контроллера использовать для обработки входящего HTTP-запроса?» — вопрос из категории ASP.NET Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Выбор действия (Action) — это процесс маршрутизации запросов (Routing), который сопоставляет входящий HTTP-запрос с исполняемым методом контроллера. Механизм работает на основе соглашений или, чаще, атрибутов маршрутизации.

Ключевые критерии сопоставления:

  1. HTTP-метод: Атрибуты [HttpGet], [HttpPost], [HttpPut] и т.д.
  2. Шаблон маршрута (Route Template): Определяется в [Route("...")] на контроллере или действии.
  3. Имя контроллера и действия (при использовании соглашений).
  4. Параметры запроса (из сегментов пути, строки запроса или тела).

Пример 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)

Процесс выбора:

  1. Промежуточное ПО маршрутизации (app.UseRouting()) анализирует URL запроса.
  2. Создается набор кандидатов — действий, чьи шаблоны и HTTP-методы совпадают.
  3. Из кандидатов выбирается наиболее специфичное действие (с большим количеством сегментов и ограничений).
  4. Если найдено несколько одинаково специфичных действий, возникает AmbiguousActionException.
  5. После выбора действия выполняется привязка модели (Model Binding) для параметров.