Компоненты middleware можно создавать, как в форме делегатов (inline middleware), так и в виде отдельных классов. При создании класса middleware мы использовали т.н. активацию middleware по соглашению, когда к создаваемом классу предъявляются определенные требования к конструктору, реализуемым методам и т.д. Вместе с этим в ASP.NET Core, начиная с версии 2.0 появилась третья возможность создания компонентов middleware — на базе фабрики классов (factory-based middleware).
Основы ASP.NET Core
Работа с окружением в ASP.NET Core. Интерфейс IWebHostEnvironment
При разработке приложения ASP.NET Core мы можем получать и работать со сведениями об окружении в котором запускается наше приложение. Для этого используется свойство Environment
класса WebApplication
, которое предоставляет сведения об окружении в виде IWebHostEnvironment
. Посмотрим какие свойства и методы мы можем использовать для работы с окружением.
Порядок построения конвейера обработки запроса в ASP.NET Core
До этого момента мы создавали компоненты middleware, не заостряя внимание на важном моменте, а именно на том, что порядок, в котором компоненты middleware добавляются в файл Program.cs
, определяет порядок их вызова при запросах и соблюдать этот порядок крайне важно для обеспечения безопасности, производительности и функциональности. Сегодня рассмотрим построение конвейера запросов с учётом порядка компонентов middleware в конвейере.
Классы middleware в ASP.NET Core
До этого момента при изучении ASP.NET Core мы использовали компоненты middleware в форме делегатов или, так называемые inline middleware. Такой подход позволяет довольно быстро встроить компонент middleware в конвейер запросов и продемонстрировать работу приложения. При этом, стоит учитывать, что далеко не всегда компонент middleware будет содержать минимум исходного кода и выполнять одно-два действия. В этом случае рекомендуется выносить логику middleware в отдельный класс с определенным описанием.
Ветвление конвейера с использованием методов MapWhen и UseWhen
В предыдущей части мы рассмотрели метод Map()
, который также как и методы Run()
и Use()
используется для встраивания middleware в конвейер запросов ASP.NET и, при этом, создает ветвление конвейера. Сегодня рассмотрим ещё два метода ASP.NET Core для встраивания middleware и ветвления конвейера запросов — это методы MapWhen()
и UseWhen()
.
Создание конвейера запросов в ASP.NET Core. Метод Map
В предыдущей части мы на основании данных запроса создали простейшую систему маршрутизации в нашем приложении ASP.NET Core. При этом, в ASP.NET Core имеются возможности создания веток конвейера запросов. В частности, сегодня мы рассмотрим создание конвейера запросов с использованием метода Map
.
Получение данных запроса. Работа с HttpRequest
При разработке web-приложений в ASP.NET Core важно знать, какой именно запрос осуществляет пользователь. Как минимум нам необходимо знать по какому пути отправлен запрос, какой HTTP-метод был использован (GET, POST, PUT и т.д.). Эти и другие свойства запроса содержаться в свойстве HttpRequest
объекта HttpContext
о котором пойдет речь далее.
Отправка ответа клиенту. Работа с HttpResponse.
Как мы уже знаем, все данные запроса передаются в компоненты middleware через объект HttpContext
(контекст запроса), который, помимо прочих полезных свойств, содержит также свойство HttpResponse
, представляющее собой объект, содержащий данные ответа клиенту. Разберемся с этим объектом более детально.
Создание конвейера запросов в ASP.NET Core с помощью WebApplication. Методы Run и Use
Как мы уже знаем, запросы в ASP.NET Core обрабатываются по принципу конвейера. В самом простейшем приложении ASP.NET Core встраивается один делегат запроса, обрабатывающий все входящие запросы. В этом случае конвейер запросов как таковой отсутствует. Вместо этого в ответ на каждый HTTP-запрос вызывается одна анонимная функция.
Конвейер обработки запросов и middleware в ASP.NET Core
Обработка каждого запроса в ASP.NET Core устроена по принципу конвейера, который состоит из различных компонентов, которые также называются middleware. Также, в русскоязычной литературе можно встретить название «ПО промежуточного слоя», «компоненты middleware» или просто — middleware. При получении запроса данные запроса передаются в первый компонент в конвейере, затем, компонент может завершить обработку запроса или же передать запрос далее по конвейеру. После того, как запрос обработан последним компонентом, он возвращается предыдущему и т.д.