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