Как настраивается маршрутизация (Routing) в контроллере ASP.NET Core?

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

Ответ

В ASP.NET Core маршрутизация настраивается двумя основными способами: атрибутной (рекомендуется для API) и конвенциональной маршрутизацией.

1. Атрибутная маршрутизация (Attribute Routing)

Наиболее гибкий и явный способ. Маршруты задаются с помощью атрибутов [Route], [HttpGet], [HttpPost] и т.д.

[ApiController]
[Route("api/[controller]")] // Базовый маршрут для всего контроллера
public class ProductsController : ControllerBase
{
    // GET api/products/5
    [HttpGet("{id:int}")]
    public IActionResult GetById(int id) { ... }

    // POST api/products
    [HttpPost]
    public IActionResult Create([FromBody] Product product) { ... }

    // GET api/products/category/books
    [HttpGet("category/{categoryName}")]
    public IActionResult GetByCategory(string categoryName) { ... }
}

Ключевые моменты:

  • [controller] и [action] — токены, заменяемые на имя контроллера (без суффикса "Controller") и метода.
  • Можно задавать ограничения для параметров прямо в шаблоне ({id:int}).
  • Позволяет создавать иерархические, RESTful-пути.

2. Конвенциональная маршрутизация (Conventional Routing)

Задается глобально в конфигурации приложения (обычно в Program.cs).

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.MapControllerRoute(
    name: "blog",
    pattern: "blog/{*slug}",
    defaults: new { controller = "Blog", action = "ReadPost" });

Когда использовать:

  • Для приложений с традиционной структурой MVC (страницы, а не API).
  • Когда нужен единый шаблон маршрутов для многих контроллеров.

Best Practice: Для веб-API предпочтительнее атрибутная маршрутизация, так как она делает пути явными и упрощает поддержку.