Метод Map

Последнее обновление: 16.05.2022

Метод 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 отправляем информацию о времени в ответ клиенту.

Ответвление конвейера обработки запроса и app.Map в ASP.NET Core и Visual Basic .NET

При других путях запросах, отличных от "/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
Сопоставление пути запроса с веткой конвейера обработки запрсоа в методе app.Map в ASP.NET Core и Visual Basic .NET

При необходимости создание веток конвейера можно вынести в отдельные методы:

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

Ветка конвейера, которая создается в методе 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".

Вложенные ветки конвейера обработки запрсоа в методе app.Map в ASP.NET Core и Visual Basic .NET
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850