Метод Run и определение терминального middleware

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

Одним из самых простых способов добавления компонента middleware в конвейер обработки запроса в ASP.NET Core представляет метод Run(), который определен как метод расширения для интерфейса IApplicationBuilder (соответствено его поддерживает и класс WebApplication):

IApplicationBuilder.Run(handler As RequestDelegate)

Метод Run добавляет терминальный компонент - такой компонент, который завершает обработку запроса. Поэтому соответствено он не вызывает никакие другие компоненты и обработку запроса дальше - следующим в конвейере компонентам не передает. Поэтому данный метод следует вызывать в самом конце построения конвейера обработки запроса. До него же могут быть помещены другие методы, которые добавляют компоненты middleware.

В качестве параметра метод Run принимает делегат RequestDelegate. Этот делегат имеет следующее определение:

Public Delegate Function RequestDelegate(context As HttpContext) As Task

Он принимает в качестве параметра контекст запроса HttpContext и возвращает объект Task.

Используем этот метод для определения простейшего компонента:

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.Run(Async Function(context As HttpContext) As Task
                    Await context.Response.WriteAsync("Hello METANIT.COM!")
                End Function)

        app.Run()
    End Sub
End Module

Здесь для делегата RequestDelegate передается лямбда-выражение, параметр которого - HttpContext можно использовать для отправки ответа. В частности, метод context.Response.WriteAsync() позволяет отправить клиенту некоторый ответ - в данном случае отправляется простая строка.

После запуска проекта будет запущено приложение. Из браузера пользователь сможет выполнить запрос к приложению и получит обратно строку "Hello METANIT.COM!".

Установка middleware в ASP.NET Core с помощью метода Run в Visual Basic .NET

Здесь следует сделать пару замечаний. Прежде всего, не стоит путать метод Run(), который определен в классе WebApplication и который запускает приложение, и метод расщирения Run(), который встраивает компонент middleware. Это два разных метода, которые выполняют разные задачи. И, как видно из кода выше, вызываются оба этих метода.

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

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.Run(AddressOf HandleRequest)

        app.Run()
    End Sub

    Async Function HandleRequest(context As HttpContext) As Task
        Await context.Response.WriteAsync("Hello METANIT.COM 2")
    End Function
End Module

Жизненный цикл middleware

Компоненты middleware создаются один раз и существуют в течение всего жизненного цикла приложения. То есть для последующей обработки запросов используются одни и те же компоненты. Например, определим в файле Program.vb следующий код:

Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Http
Module Program
    Sub Main(args As String())

        Dim builder = WebApplication.CreateBuilder(args)
        Dim app = builder.Build()

        Dim n = 2
        app.Run(Async Function(context As HttpContext) As Task

                    n = n * 2  '2 * 2 = 4
                    Await context.Response.WriteAsync($"Result: {n}")
                End Function)

        app.Run()
    End Sub
End Module

При запуске приложения мы естественно ожидаем, что браузер выведет число 4 в качестве результата:

Жизненный цикл middleware в ASP.NET Core и Visual Basic .NET

Однако при последующих запросах мы увидим, что результат переменной х не равен 4.

Жизненный цикл приложения в ASP.NET Core и Visual Basic .NET

Также стоит отметить, что браузер Google Chrome может посылать два запроса - один собственно к приложению, а другой - к файлу иконки favicon.ico, поэтому в Google Chrome результат может отличаться не 2 раза, а гораздо больше.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850