Одна из основных задач приложения - это обработка входящих запросов. Обработка запроса в ASP.NET Core устроена по принципу конвейера, который состоит из компонентов. Подобные компоненты еще называются middleware (в русском языке до сих пор нет адекватного термина для подобным компонента, поэтому далее они именуются преимущественно как "компоненты middleware" или просто middleware).
При получении запроса сначала данные запроса получает первый компонент в конвейере. После обработки запроса компонент middleware он может закончить обработку запроса - такой компонент еще называется терминальным компонентом (terminal middleware ). Либо он может передать данные запроса для обработки далее по конвейеру - следующему в конвейере компоненту и так далее. После обработки запроса последним компонентом, данные запроса возвращаются к предыдущему компоненту. Схематически это можно отобразить так:
Компоненты middleware встраиваются с помощью методов расширений Run
, Map
и Use
интерфейса
IApplicationBuilder. Класс WebApplication реализует данный интерфейс и поэтому позволяет
добавлять компоненты middleware с помощью данных методов.
Каждый компонент middleware может быть определен как метод (встроенный inline компонент), либо может быть вынесен в отдельный класс.
Для создания компонентов middleware используется делегат RequestDelegate, который выполняет некоторое действие и принимает контекст запроса - объект HttpContext:
public delegate Task RequestDelegate(HttpContext context);
При получении запроса сервер формирует на его основе объект HttpContext, которые содержит всю необходимую информацию о запросе. Эта информация посредством объекта HttpContext передается всем компонентам middleware в приложении.
Рассмотрим, какую информацию мы можем получить из HttpContext. Для этого пройдемся по его свойствам:
Connection: представляет информацию о подключении, которое установлено для данного запроса
Features: получает коллекцию HTTP-функциональностей, которые доступны для этого запроса
Items: получает или устанавливает коллекцию пар ключ-значение для хранения некоторых данных для текущего запроса
Request: возвращает объект HttpRequest, который хранит информацию о текущем запросе
RequestAborted: уведомляет приложение, когда подключение прерывается, и соответственно обработка запроса должна быть отменена
RequestServices: получает или устанавливает объект IServiceProvider, который предоставляет доступ к контейнеру сервисов запроса
Response: возвращает объект HttpResponse, который позволяет управлять ответом клиенту
Session: хранит данные сессии для текущего запроса
TraceIdentifier: представляет уникальный идентификатор запроса для логов трассировки
User: представляет пользователя, ассоциированного с этим запросом
WebSockets: возвращает объект для управления подключениями WebSocket для данного запроса
Используя эти свойства мы можем в компоненте 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
Для встраивания этих компонентов в конвейер обработки запроса для интерфейса IApplicationBuilder определены методы расширения типа
UseXXX
.
Например, фреймворк ASP.NET Core по умолчанию предоставляет такой middleware как WelcomePageMiddleware, который отправляет клиенту некоторую стандартную веб-страницу. Для подключения этого компонента в конвейер запроса применяется метод расширения UseWelcomePage():
var builder = WebApplication.CreateBuilder(); var app = builder.Build(); app.UseWelcomePage(); // подключение WelcomePageMiddleware app.Run();
И при выполнении этого приложения браузер представит нашему взору следующую красочную страницу: