Метод Map() применяется для создания ветки конвейера, которая будет обрабатывать запрос по определенному пути. Этот метод реализован как метод расширения для типа IApplicationBuilder и имеет ряд перегруженных версий. Например:
Map (pathMatch As String, configuration Action(Of IApplicationBuilder));
В качестве параметра pathMatch
метод принимает путь запроса, с которым будет сопоставляться ветка. А параметр configuration
представляет делегат, в который передается объект IApplicationBuilder и в котором будет создаваться ветка конвейера.
Рассмотрим простой пример:
Imports Microsoft.AspNetCore.Builder Imports Microsoft.AspNetCore.Http Module Program Sub Main(args As String()) Dim builder = WebApplication.CreateBuilder(args) Dim app = builder.Build() app.Map("/time", Sub(appBuilder) Dim time = Now.ToShortTimeString() 'логгируем данные - выводим на консоль приложения appBuilder.Use(Async Function(context, nextMiddleware) As Task Console.WriteLine($"Time: {time}") Await nextMiddleware() 'вызываем следующий middleware End Function) appBuilder.Run(Async Function(context) As Task Await context.Response.WriteAsync($"Time: {time}") End Function) End Sub) app.Run(Async Function(context As HttpContext) As Task Await context.Response.WriteAsync("Hello METANIT.COM") End Function) app.Run() End Sub End Module
В данном случае метод app.Map()
создает ответвление конвейера, которое будет обрабатывать запросы по пути "/time":
Sub(appBuilder) Dim time = Now.ToShortTimeString() 'логгируем данные - выводим на консоль приложения appBuilder.Use(Async Function(context, nextMiddleware) As Task Console.WriteLine($"Time: {time}") Await nextMiddleware() 'вызываем следующий middleware End Function) appBuilder.Run(Async Function(context) As Task Await context.Response.WriteAsync($"Time: {time}") End Function) End Sub
Созданная ветка конвейера содержит два middleware, встраиваемые с помощью методов Use()
и Run()
. Вначале получаем текущее время и в
первом middleware логгируем это время на консоль. Во втором - терминальном компоненте middleware отправляем информацию о времени в ответ клиенту.
При других путях запросах, отличных от "/time", запрос будет обрабатываться основным потоком конвейера, который состоит в данном случае из одного компонента:
app.Run(Async Function(context As HttpContext) As Task Await context.Response.WriteAsync("Hello METANIT.COM") End Function)
Подобным образом можно создавать ветки для разных путей:
Imports Microsoft.AspNetCore.Builder Imports Microsoft.AspNetCore.Http Module Program Sub Main(args As String()) Dim builder = WebApplication.CreateBuilder(args) Dim app = builder.Build() app.Map("/index", Sub(appBuilder) appBuilder.Run(Async Function(context) As Task Await context.Response.WriteAsync("Index Page") End Function) End Sub) app.Map("/about", Sub(appBuilder) appBuilder.Run(Async Function(context) As Task Await context.Response.WriteAsync("About Page") End Function) End Sub) app.Run(Async Function(context As HttpContext) As Task Await context.Response.WriteAsync("Page Not Found") End Function) app.Run() End Sub End Module
При необходимости создание веток конвейера можно вынести в отдельные методы:
Imports Microsoft.AspNetCore.Builder Imports Microsoft.AspNetCore.Http Module Program Sub Main(args As String()) Dim builder = WebApplication.CreateBuilder(args) Dim app = builder.Build() app.Map("/index", AddressOf Index) app.Map("/about", AddressOf About) app.Run(AddressOf NotFound) app.Run() End Sub Async Function NotFound(context As HttpContext) As Task Await context.Response.WriteAsync("Page Not Found") End Function Sub About(appBuilder As IApplicationBuilder) appBuilder.Run(Async Function(context) As Task Await context.Response.WriteAsync("About Page") End Function) End Sub Sub Index(appBuilder As IApplicationBuilder) appBuilder.Run(Async Function(context) As Task Await context.Response.WriteAsync("Index Page") End Function) End Sub End Module
Ветка конвейера, которая создается в методе Map(), может иметь вложенные ветки, которые обрабатывают подзапросы. Например:
Imports Microsoft.AspNetCore.Builder Imports Microsoft.AspNetCore.Http Module Program Sub Main(args As String()) Dim builder = WebApplication.CreateBuilder(args) Dim app = builder.Build() app.Map("/home", Sub(appBuilder As IApplicationBuilder) ' вложенные маршруты appBuilder.Map("/index", AddressOf Index) appBuilder.Map("/about", AddressOf About) appBuilder.Run(AddressOf Home) End Sub) app.Run(AddressOf NotFound) app.Run() End Sub Async Function NotFound(context As HttpContext) As Task Await context.Response.WriteAsync("Page Not Found") End Function Async Function Home(context As HttpContext) As Task Await context.Response.WriteAsync("Home Page") End Function Sub About(appBuilder As IApplicationBuilder) appBuilder.Run(Async Function(context) As Task Await context.Response.WriteAsync("About Page") End Function) End Sub Sub Index(appBuilder As IApplicationBuilder) appBuilder.Run(Async Function(context) As Task Await context.Response.WriteAsync("Index Page") End Function) End Sub End Module
Здесь ветка создается с помощью вызова
app.Map("/home", Sub(appBuilder As IApplicationBuilder)
Эта ветка будет обрабатывать запросы по пути "/home".
Внутри этой ветки создаются две вложенные ветки, которые будут обрабатывать запросы по путям относительно пути основной ветки. То есть теперь метод About будет обрабатывать запрос по пути "/home/about", а не "/about".