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

По мере прохождения данных запроса от первого компонента в конвейере к последнему компоненты могут каким-либо образом изменять/дополнять данные запроса. При движении в обратном направлении — от последнего компонента к первому, могут проводится какие-либо манипуляции с данными ответа.
Компоненты middleware встраиваются в конвейер с помощью методов Run
, Map
и Use
интерфейса IApplicationBuilder
, который реализуется классом WebApplication
. При этом, компонент middleware может быть определен как метод (встроенный inline компонент) или же может быть вынесен в отдельный класс.
Делегат запроса и контекст
Для создания компонентов middleware используется делегат RequestDelegate
, который выполняет некоторое действие и принимает контекст запроса — объект HttpContext
:
public delegate Task RequestDelegate(HttpContext context);
Сервер формирует на основе запроса объект HttpContext
, который содержит всю необходимую информацию о запросе, которая передаётся всем компонентам middleware в приложении. Рассмотрим основные свойства у HttpContext
Connection |
Возвращает сведения о базовом подключении для этого запроса. |
Features |
Возвращает коллекцию функций HTTP, предоставляемых сервером и middleware, доступных в этом запросе. Это свойство, в частности, можно использовать для получения информации об ошибках в приложени. |
Items |
Возвращает или задает коллекцию пар «ключ-значение», которую можно использовать для совместного использования данных в области запроса. |
Request |
Объект HttpRequest , содержащий данные запроса. |
Request |
Уведомляет приложение о прерывании подключения, лежащего в основе этого запроса, и поэтому операции запроса должны быть отменены. |
Request |
Возвращает или задает объект , IServiceProvider предоставляющий доступ к контейнеру службы запроса. |
Response |
Объект HttpResponse , с помощью которого можно управлять данными ответа сервера.. |
Session |
Возвращает или задает объект , используемый для управления данными сеанса пользователя для этого запроса. |
Trace |
Возвращает или задает уникальный идентификатор для представления этого запроса в журналах трассировки. |
User |
Возвращает или задает пользователя для этого запроса. |
Web |
Возвращает объект , который управляет установлением подключений 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 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 построена по принципу конвейера в котором принимают участие компоненты middleware. Каждый компонент может добавлять некую дополнительную функциональность в обработку запроса — проверять аутентификацию пользователя, вести лог, перенаправлять запрос и т.д. В ASP.NET Core представлен ряд встроенных компонентов middleware для выполнения часто встречающихся задач. Для подключение встроенных компонентов middleware используются методы расширения WebApplication
типа UseXXX
.