Как настраивают Routing в контроллере?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Настройка маршрутизации в ASP.NET Core контроллерах
Маршрутизация в ASP.NET Core — это механизм сопоставления входящих HTTP-запросов с обработчиками (действиями контроллеров). Существует несколько подходов к настройке, которые можно комбинировать.
Основные подходы к маршрутизации
- Conventional Routing (Обычная маршрутизация)
- Attribute Routing (Маршрутизация с помощью атрибутов)
- Endpoint Routing (Маршрутизация конечных точек, появившаяся в ASP.NET Core 3.0+)
1. Conventional Routing (обычная маршрутизация)
Настраивается в классе Startup (или Program.cs в .NET 6+) с помощью шаблонов:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
// Стандартный шаблон для контроллеров
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
// Кастомный маршрут
endpoints.MapControllerRoute(
name: "products",
pattern: "shop/{category}/{id:int}",
defaults: new { controller = "Products", action = "Details" });
});
}
Ключевые компоненты шаблона:
{controller}- имя контроллера (без суффикса "Controller"){action}- имя метода действия{id?}- опциональный параметр с вопросительным знаком{id:int}- параметр с ограничением типа (только целые числа)
2. Attribute Routing (маршрутизация атрибутами)
Наиболее гибкий и современный подход. Атрибуты размещаются непосредственно на контроллерах и действиях:
Базовые атрибуты маршрутизации:
[Route("api/[controller]")]
[ApiController]
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
[HttpPost]
public IActionResult Create([FromBody] Product product) { /* ... */ }
// PUT api/products/5
[HttpPut("{id}")]
public IActionResult Update(int id, [FromBody] Product product) { /* ... */ }
// DELETE api/products/5
[HttpDelete("{id:int:min(1)}")]
public IActionResult Delete(int id) { /* ... */ }
}
3. Endpoint Routing (современная система)
В .NET Core 3.0+ используется система маршрутизации конечных точек, которая объединяет MVC, Razor Pages и другие компоненты:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
var app = builder.Build();
app.UseRouting();
app.MapControllers(); // Автоматически регистрирует маршруты из атрибутов
// Или настройка вручную:
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
Комбинирование подходов и расширенные возможности
Ограничения маршрутов (Constraints)
[Route("api/[controller]")]
public class OrdersController : Controller
{
// Только целочисленный id
[HttpGet("{id:int:min(1)}")]
public IActionResult GetOrder(int id) { /* ... */ }
// Только определенный формат даты
[HttpGet("date/{date:datetime}")]
public IActionResult GetByDate(DateTime date) { /* ... */ }
// Сочетание нескольких ограничений
[HttpGet("{id:int}/{status:regex(^(pending|completed|cancelled)$)}")]
public IActionResult GetOrderWithStatus(int id, string status) { /* ... */ }
}
Именованные маршруты и генерация URL
[Route("blog")]
public class BlogController : Controller
{
[HttpGet("posts/{slug}", Name = "blog_post")]
public IActionResult Post(string slug) { /* ... */ }
[HttpGet("archive/{year:int}/{month:int?}/{day:int?}")]
public IActionResult Archive(int year, int? month, int? day)
{
// Генерация URL для именованного маршрута
var url = Url.RouteUrl("blog_post", new { slug = "my-post" });
return Ok();
}
}
Токены маршрутизации
Специальные токены упрощают поддержку маршрутов:
[Route("[controller]/[action]")] // Автоматически подставляются имена контроллера и действия
[Route("api/[controller]")] // "api/products" для ProductsController
[Area("[area]/[controller]")] // Поддержка областей
Порядок сопоставления маршрутов
ASP.NET Core использует определенный порядок:
- Более конкретные маршруты имеют приоритет над общими
- Атрибутивные маршруты имеют приоритет над обычными
- Порядок регистрации влияет при совпадении приоритетов
Рекомендации по настройке
- Для Web API используйте Attribute Routing — он более читаем, удобен для рефакторинга и документирования
- Гибридный подход: настройте "запасной" обычный маршрут в
MapControllerRouteкак default, а для API-эндпоинтов используйте атрибуты - Версионирование API: реализуйте через атрибуты маршрутизации:
[Route("api/v1/[controller]")] - Ограничения маршрутов помогают валидировать входные данные на уровне маршрутизации
- Именованные маршруты упрощают генерацию ссылок в коде
Пример комплексной настройки
// Startup.cs или Program.cs
app.UseEndpoints(endpoints =>
{
// Области для админ-панели
endpoints.MapAreaControllerRoute(
name: "admin_area",
areaName: "Admin",
pattern: "Admin/{controller=Dashboard}/{action=Index}/{id?}");
// API версионирование (обычная маршрутизация)
endpoints.MapControllerRoute(
name: "api_v1",
pattern: "api/v1/{controller}/{action}/{id?}",
defaults: new { area = "ApiV1" });
// Запасной маршрут для MVC
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
// В контроллере
[Route("api/v{version:apiVersion}/[controller]")]
[ApiVersion("1.0")]
public class ModernApiController : ControllerBase
{
[HttpGet("filter")]
public IActionResult Filter([FromQuery] FilterModel filter)
{
// Современный подход с моделью привязки
return Ok();
}
}
Правильная настройка маршрутизации критически важна для производительности, безопасности и поддерживаемости приложения. Выбор подхода зависит от типа приложения (MVC, API, гибридное) и требований к гибкости и читаемости кода.