← Назад к вопросам

Какие знаешь способы настройки маршрутизации в ASP.NET приложении?

2.0 Middle🔥 292 комментариев
#ASP.NET и Web API

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Способы настройки маршрутизации в ASP.NET

Маршрутизация — это фундаментальный механизм в ASP.NET, который сопоставляет входящие HTTP-запросы с обработчиками (контроллерами, страницами или методами). Существует несколько подходов к настройке, которые различаются в зависимости от типа приложения (MVC, Web API, Razor Pages, Blazor) и версии фреймворка.

1. Маршрутизация на основе атрибутов (Attribute Routing)

Наиболее современный и гибкий подход, доступный в ASP.NET Core и Web API 2+. Позволяет определять маршруты непосредственно над контроллерами и методами действий с помощью атрибутов.

[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    [HttpGet("{id:int}")] // /api/products/5
    public IActionResult GetById(int id) { ... }

    [HttpGet("search/{name}")] // /api/products/search/laptop
    public IActionResult SearchByName(string name) { ... }

    [HttpPost("create")]
    public IActionResult Create([FromBody] Product product) { ... }
}

Преимущества:

  • Полный контроль над URL
  • Поддержка сложных шаблонов с ограничениями
  • Лёгкая читаемость и поддержка

2. Обычная (Conventional) маршрутизация

Классический подход, используемый в ASP.NET MVC и Razor Pages, где маршруты определяются централизованно в конфигурации приложения.

// В Startup.Configure (ASP.NET Core)
app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
    
    endpoints.MapControllerRoute(
        name: "blog",
        pattern: "blog/{*slug}",
        defaults: new { controller = "Blog", action = "Post" });
});

Ключевые элементы шаблона:

  • {controller} — имя контроллера
  • {action} — имя метода действия
  • {id?} — необязательный параметр
  • Значения по умолчанию указываются через =

3. Маршрутизация в Razor Pages

Для Razor Pages используется особый подход, где путь к файлу страницы (.cshtml) определяет маршрут.

// В Startup.ConfigureServices
services.AddRazorPages();
// В Startup.Configure
app.UseEndpoints(endpoints =>
{
    endpoints.MapRazorPages();
});

Особенности:

  • Страница /Pages/Products/Index.cshtml доступна по /Products/Index
  • Можно кастомизировать через @page директиву в начале файла:
@page "/catalog/{categoryId:int}"

4. Маршрутизация для Minimal API (ASP.NET Core 6+)

Упрощённый подход для создания API с минимальной конфигурацией.

var app = WebApplication.Create();
app.MapGet("/products/{id}", (int id) => GetProductById(id));
app.MapPost("/products", (Product product) => CreateProduct(product));
app.MapPut("/products/{id}", (int id, Product product) => UpdateProduct(id, product));

5. Маршрутизация с ограничениями (Constraints)

Позволяет валидировать параметры маршрута на соответствие определённым правилам.

// Через атрибуты
[Route("users/{id:int:min(1)}")]
[HttpGet("search/{name:alpha:minlength(2)}")]

// Через обычную маршрутизацию
endpoints.MapControllerRoute(
    name: "product",
    pattern: "product/{id:int}",
    defaults: new { controller = "Product", action = "Details" });

Типы ограничений:

  • int, bool, datetime — проверка типа
  • min(), max(), range() — числовые диапазоны
  • alpha, regex() — строковые ограничения
  • minlength(), maxlength() — длина строки

6. Настройка через MapWhen и UseWhen

Для условной маршрутизации на основе свойств запроса.

app.MapWhen(context => context.Request.Path.StartsWithSegments("/api"),
    apiApp =>
    {
        apiApp.UseRouting();
        apiApp.UseEndpoints(endpoints => endpoints.MapControllers());
    });

7. Кастомизация через IRouteConstraint

Создание собственных ограничений маршрутов.

public class CustomConstraint : IRouteConstraint
{
    public bool Match(HttpContext httpContext, IRouter route, string routeKey, 
                      RouteValueDictionary values, RouteDirection routeDirection)
    {
        // Логика проверки
        return values[routeKey]?.ToString().StartsWith("test") == true;
    }
}

// Регистрация
services.Configure<RouteOptions>(options => 
    options.ConstraintMap.Add("custom", typeof(CustomConstraint)));

8. Наследование маршрутов

В атрибутной маршрутизации можно применять наследование маршрутов от базового контроллера.

[Route("api/[controller]")]
public class BaseApiController : ControllerBase { }

public class ProductsController : BaseApiController
{
    // Унаследует маршрут /api/products
    [HttpGet]
    public IActionResult GetAll() { ... }
}

Рекомендации по выбору подхода

  1. Для REST API — используйте атрибутную маршрутизацию или Minimal API
  2. Для традиционных MVC-приложений — комбинируйте обычную и атрибутную маршрутизацию
  3. Для контент-сайтовRazor Pages с директивой @page
  4. Для сложных правил — создавайте кастомные ограничения через IRouteConstraint

Важные аспекты при настройке

  • Порядок регистрации маршрутов — первый подходящий маршрут обрабатывает запрос
  • Переопределение маршрутов — через атрибут [Route("")] в методах действий
  • Генерация URL — использование IUrlHelper, LinkGenerator для создания ссылок
  • Обработка ошибок — настройка [HandleError], промежуточного ПО для несуществующих маршрутов

Правильная настройка маршрутизации критически важна для SEO, удобства API и безопасности приложения. В современных ASP.NET Core приложениях рекомендуется преимущественно использовать атрибутную маршрутизацию как наиболее декларативный и поддерживаемый подход.