Как работает механизм маршрутизации в ASP.NET Core
Что проверяют
Понимаете ли вы endpoint routing: что маршрут выбирается раньше, чем выполняется, и почему между этими шагами стоят аутентификация, авторизация и CORS. Следом спрашивают про атрибутную маршрутизацию и про то, что будет, если два маршрута подходят одинаково.
Как отвечать
Маршрутизация в ASP.NET Core делится на два middleware:
UseRouting: сопоставляет URL и метод с одной конечной точкой (Endpoint) и кладёт её вHttpContext, достать можно черезGetEndpoint();UseEndpoints: выполняет делегат выбранной точки, будь то действие контроллера, Razor Page или minimal API.
Всё, что зарегистрировано между ними, уже видит выбранную точку и её метаданные. Поэтому UseAuthentication и UseAuthorization стоят именно там: так они читают [Authorize] и политики. В шаблоне WebApplication с .NET 6 оба вызова добавляются неявно, а маршруты регистрируются прямо на app: app.MapGet(...), app.MapControllers(), app.MapGroup("/api/orders") для общих префиксов и фильтров.
Как выбирается точка. Из всех шаблонов строится общий матчер, и при нескольких совпадениях побеждает более специфичный: литеральный сегмент сильнее параметра, параметр с ограничением сильнее параметра без него, catch-all {**path} слабее всех. Явный порядок задаётся через Order. Если специфичность равна, запрос падает с AmbiguousMatchException.
Синтаксис шаблонов: значения по умолчанию {controller=Home}/{action=Index}, необязательный {id?}, ограничения {id:int} и {slug:regex(...)}. Для API принята атрибутная маршрутизация через [Route("api/[controller]")] и [HttpGet("{id:int}")], для MVC с представлениями встречается conventional-маршрут. Ссылки строит LinkGenerator по имени маршрута.
Где спотыкаются
Рассказывают про Startup.Configure и RouteTable как про текущее состояние. RouteTable из старого ASP.NET на System.Web, в Core его нет.
Используют ограничения как валидацию. Нечисловой id при {id:int} даст 404 вместо понятного 400, проверять ввод нужно в модели.
При явном UseRouting ставят UseAuthorization перед ним. Точка ещё не выбрана, и запрос к действию с [Authorize] падает с InvalidOperationException.