Основная задача веб-приложения состоит в обработке входящих запросов. В ASP.NET Core обработка запроса устроена по принципу конвейера, который состоит из компонентов. Данные компоненты еще называют middleware.
Когда к приложению приходит запрос, все данные запроса сначала получает первый компонент в конвейере. После обработки запроса компонент middleware может закончить обработку запроса - такой компонент еще называется терминальным компонентом (terminal middleware ). Либо он может передать данные запроса для обработки далее по конвейеру - следующему в конвейере компоненту и так далее. После обработки запроса последним компонентом, данные запроса возвращаются к предыдущему компоненту. Схематически это можно отобразить так:
Компоненты middleware встраиваются с помощью методов расширений Run
, Map
и Use
интерфейса
IApplicationBuilder. Класс WebApplication реализует данный интерфейс и поэтому позволяет
добавлять компоненты middleware с помощью данных методов.
Каждый компонент middleware может быть определен как метод (встроенный inline компонент), либо может быть вынесен в отдельный класс.
Для создания компонентов middleware используется делегат RequestDelegate, который выполняет некоторое действие и принимает контекст запроса - объект HttpContext:
Public Delegate Function RequestDelegate(context As HttpContext) As Task
При получении запроса сервер формирует на его основе объект 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():
Imports Microsoft.AspNetCore.Builder Module Program Sub Main(args As String()) Dim builder = WebApplication.CreateBuilder(args) Dim app = builder.Build() app.UseWelcomePage() 'подключение WelcomePageMiddleware app.Run() End Sub End Module
И при выполнении этого приложения браузер представит нашему взору следующую красочную страницу: