Одним из самых простых способов добавления компонента 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!".
Здесь следует сделать пару замечаний. Прежде всего, не стоит путать метод 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 создаются один раз и существуют в течение всего жизненного цикла приложения. То есть для последующей обработки запросов используются одни и те же компоненты. Например, определим в файле 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 в качестве результата:
Однако при последующих запросах мы увидим, что результат переменной х не равен 4.
Также стоит отметить, что браузер Google Chrome может посылать два запроса - один собственно к приложению, а другой - к файлу иконки favicon.ico, поэтому в Google Chrome результат может отличаться не 2 раза, а гораздо больше.