Язык программирования C#9 и платформа .NET5
Маршрутизация и REST-службы ASP.NET Core
При определении маршрутов для служб ASP.NET метод действия не указывается. Вместо этого, как только контроллер обнаруживается, выполняемый метод действия базируется на методе HTTP запроса и назначениях методов HTTP методам действий. Детали будут приведены чуть позже.
Маршрутизация на основе соглашений
При маршрутизации на основе соглашений (или традиционной маршрутизации) таблица маршрутов строится в методе
классаUseEndpoints(). МетодStartupдобавляет конечную точку в таблицу маршрутов, указывая имя, шаблон URL и любые стандартные значения для переменных в шаблоне URL. В приведенном ниже примере кода заранее определенные заполнителиMapControllerRoute()и{controller}ссылаются на контроллер и метод действия, содержащийся в данном контроллере. Заполнитель{action}является специальным и транслируется в параметр (по имени{id}) для метода действия. Добавление к маркеру маршрута знака вопроса указывает на его необязательность.idapp.UseEndpoints(endpoints =>{endpoints.MapControllerRoute(name: "default",template: "{controller=Home}/{action=Index}/{id?}");});Запрашиваемый URL проверяется на соответствие с таблицей маршрутов. При наличии совпадения выполняется код, находящийся в этой конечной точке приложения. Примером URL, который мог бы обслуживаться таким маршрутом, является
. В результате вызывается метод действияCar/Delete/5класса контроллераDelete()с передачей значенияCarControllerв параметре5.idВ параметре
указано, каким образом заполнять пустые фрагменты в URL, которые содержат не все определенные компоненты. С учетом предыдущего кода, если в URL ничего не задано (например,default), тогда механизм маршрутизации вызовет метод действияhttp://localhost:5001классаIndex()без параметраHomeController. Параметруidприсуща поступательность, т.е. он допускает исключение справа налево. Однако пропускать части маршрута не разрешено. Ввод URL видаdefaultне пройдет сопоставление с шаблономhttp://localhost:5001/Delete/5.{controller}/{action}/{id}Механизм маршрутизации попытается отыскать первый маршрут на основе контроллера, действия, специальных маркеров и метода HTTP. Если механизм маршрутизации не может определить наилучший маршрут, тогда он сгенерирует исключение
.AmbiguousMatchExceptionОбратите внимание, что шаблон маршрута не содержит протокол или имя хоста. Механизм маршрутизации автоматически добавляет в начало корректную информацию при создании маршрута и применяет метод HTTP, путь и параметры для определения соответствующей конечной точки приложения. Например, если ваш сайт запускается на
, то протокол (HTTPS) и имя хоста (https://www.skimedic.com) автоматически добавляются к маршруту при его создании (скажем,www.skimedic.com). Для входящего запроса механизм маршрутизации использует порциюhttps://www.skimedic.com/Car/Delete/5из URL.Car/Delete/5Именованные маршруты
Имена маршрутов могут применяться в качестве сокращения для генерации URL изнутри приложения. Выше конечной точке было назначено имя
.defaultМаршрутизация с помощью атрибутов
При маршрутизации с помощью атрибутов маршруты определяются с использованием атрибутов C# в отношении контроллеров и их методов действий. Это может привести к более точной маршрутизации, но также увеличит объем конфигурации, поскольку для каждого контроллера и действия необходимо указать информацию маршрутизации.
Например, взгляните на приведенный ниже фрагмент кода. Четыре атрибута
на методе действияRouteэквивалентны маршруту, который был определен ранее. Метод действияIndex()является конечной точкой приложения дляIndex(),mysite.com,mysite.com/Homeилиmysite.com/Home/Index.mysite.com/Home/Index/5public class HomeController : Controller{<b> [Route("/")]</b><b> [Route("/Home")]</b><b> [Route("/Home/Index")]</b><b> [Route("/Home/Index/{id?}")]</b>public IActionResult Index(int? id){...}}Основное различие между маршрутизацией на основе соглашений и маршрутизацией с помощью атрибутов заключается в том, что первая охватывает приложение, тогда как вторая — контроллер с атрибутом
. Если маршрутизация на основе соглашений не применяется, то каждому контроллеру понадобится определить свой маршрут, иначе доступ к нему будет невозможен. Скажем, если в таблице маршрутов не определен стандартный маршрут, тогда следующий код обнаружить не удастся, т.к. маршрутизация для контроллера не сконфигурирована:Routepublic class CarController : Controller{public IActionResult Delete(int id){...}}На заметку! Маршрутизацию на основе соглашений и маршрутизацию с помощью атрибутов можно использовать вместе. Если бы в методе
был настроен стандартный маршрут контроллера (как в примере с маршрутизацией на основе соглашений), то предыдущий контроллер попал бы в таблицу маршрутов.UseEndpoints()