Конвейер обработки запросов и middleware в ASP.NET Core

Обработка каждого запроса в ASP.NET Core устроена по принципу конвейера, который состоит из различных компонентов, которые также называются middleware. Также, в русскоязычной литературе можно встретить название «ПО промежуточного слоя», «компоненты middleware» или просто — middlewareПри получении запроса данные запроса передаются в первый компонент в конвейере, затем, компонент может завершить обработку запроса или же передать запрос далее по конвейеру. После того, как запрос обработан последним компонентом, он возвращается предыдущему и т.д.

Схема обработки запросов в ASP.NET

Схематично, обработку запроса в ASP.NET можно представить следующим образом:

конвейер запросов ASP.NET Core
конвейер запросов ASP.NET Core

По мере прохождения данных запроса от первого компонента в конвейере к последнему компоненты могут каким-либо образом изменять/дополнять данные запроса. При движении в обратном направлении — от последнего компонента к первому, могут проводится какие-либо манипуляции с данными ответа.

Компоненты middleware встраиваются в конвейер с помощью методов RunMap и Use интерфейса IApplicationBuilder, который реализуется классом WebApplication. При этом, компонент middleware может быть определен как метод (встроенный inline компонент) или же может быть вынесен в отдельный класс.

Делегат запроса и контекст

Для создания компонентов middleware используется делегат RequestDelegate, который выполняет некоторое действие и принимает контекст запроса — объект HttpContext:

public delegate Task RequestDelegate(HttpContext context);

Сервер формирует на основе запроса объект HttpContext, который содержит всю необходимую информацию о запросе, которая передаётся всем компонентам middleware в приложении. Рассмотрим основные свойства у HttpContext

Connection Возвращает сведения о базовом подключении для этого запроса.
Features Возвращает коллекцию функций HTTP, предоставляемых сервером и middleware, доступных в этом запросе. Это свойство, в частности, можно использовать для получения информации об ошибках в приложени.
Items Возвращает или задает коллекцию пар «ключ-значение», которую можно использовать для совместного использования данных в области запроса.
Request Объект HttpRequest, содержащий данные запроса.
RequestAborted Уведомляет приложение о прерывании подключения, лежащего в основе этого запроса, и поэтому операции запроса должны быть отменены.
RequestServices Возвращает или задает объект , IServiceProvider предоставляющий доступ к контейнеру службы запроса.
Response Объект HttpResponse, с помощью которого можно управлять данными ответа сервера..
Session Возвращает или задает объект , используемый для управления данными сеанса пользователя для этого запроса.
TraceIdentifier Возвращает или задает уникальный идентификатор для представления этого запроса в журналах трассировки.
User Возвращает или задает пользователя для этого запроса.
WebSockets Возвращает объект , который управляет установлением подключений WebSocket для этого запроса.

Используя представленные выше свойства в компоненте middleware мы можем получить достаточно большое количество исходной информации по запросу и отправить клиенту ответ.

Встроенные компоненты middleware

В ASP.NET Core по умолчанию предоставлен ряд встроенных компонентов middleware для часто встречающихся задач.

Authentication предоставляет поддержку аутентификации пользователей
Authorization предоставляет поддержку авторизации
Cookie Policy отслеживает согласие пользователя на хранение связанной с ним информации в куках
CORS обеспечивает поддержку кроссдоменных запросов
DeveloperExceptionPage генерирует веб-страницу с информацией об ошибке при работе в режиме разработки
Diagnostics набор middleware, который предоставляет страницы статусных кодов, функционал обработки исключений, страницу исключений разработчика
Forwarded Headers перенаправляет заголовки запроса
Health Check проверяет работоспособность приложения asp.net core
Header Propagation обеспечивает передачу заголовков из HTTP-запроса
HTTP Logging ведет журнал входящих запросов и генерируемых ответах
HTTP Method Override позволяет входящему POST-запросу переопределить метод
HTTPS Redirection перенаправляет все запросы HTTP на HTTPS
HTTP Strict Transport Security (HSTS) для улучшения безопасности приложения добавляет специальный заголовок ответа
MVC обеспечивает функционал фреймворка MVC
OWIN обеспечивает взаимодействие с приложениями, серверами и компонентами, построенными на основе спецификации OWIN
Request Localization обеспечивает поддержку локализации
Response Caching позволяет кэшировать результаты запросов
Response Compression обеспечивает сжатие ответа клиенту
URL Rewrite предоставляет функциональность URL Rewriting
Endpoint Routing предоставляет механизм маршрутизации
Session предоставляет поддержку сессий
SPA обрабатывает все запросы, возвращая страницу по умолчанию для SPA-приложения (одностраничного приложения)
Static Files предоставляет поддержку обработки статических файлов
WebSockets добавляет поддержку протокола WebSockets
W3CLogging генерирует логи доступа в соответствии с форматом W3C Extended Log File Format

 

Это не полный перечень компонентов middleware, предоставляемых по умолчанию ASP.NET Core. Для встраивания этих компонентов в конвейер обработки запроса у интерфейса IApplicationBuilder определены методы расширения типа UseXXX.

ASP.NET Use middleware

Например, ASP.NET Core по умолчанию предоставляет middleware под названием WelcomePageMiddleware, который отправляет клиенту стандартную веб-страницу приветствия. Для подключения этого компонента в конвейер запроса применяется метод расширения UseWelcomePage():

public static void Main(string[] args)
{
    var builder = WebApplication.CreateBuilder(args);
    var app = builder.Build();
    app.UseWelcomePage(); //подключили middleware 
    app.Run();
}

При запуске приложения браузер откроет следующую страницу:

asp.net welcome page

Итого

Обработка запросов в ASP.NET построена по принципу конвейера в котором принимают участие компоненты middleware. Каждый компонент может добавлять некую дополнительную функциональность в обработку запроса — проверять аутентификацию пользователя, вести лог, перенаправлять запрос и т.д. В ASP.NET Core представлен ряд встроенных компонентов middleware для выполнения часто встречающихся задач. Для подключение встроенных компонентов middleware используются методы расширения WebApplication типа UseXXX.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии