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

Последнее обновление: 10.12.2021

Одна из основных задач приложения - это обработка входящих запросов. Обработка запроса в ASP.NET Core устроена по принципу конвейера, который состоит из компонентов. Подобные компоненты еще называются middleware (в русском языке до сих пор нет адекватного термина для подобным компонента, поэтому далее они именуются преимущественно как "компоненты middleware" или просто middleware).

При получении запроса сначала данные запроса получает первый компонент в конвейере. После обработки запроса компонент middleware он может закончить обработку запроса - такой компонент еще называется терминальным компонентом (terminal middleware ). Либо он может передать данные запроса для обработки далее по конвейеру - следующему в конвейере компоненту и так далее. После обработки запроса последним компонентом, данные запроса возвращаются к предыдущему компоненту. Схематически это можно отобразить так:

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

Компоненты 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 получить если не все, то большую часть необходимых данных о запросе и отправить обратно клиенту некоторый ответ.

Встроенные компоненты 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();

И при выполнении этого приложения браузер представит нашему взору следующую красочную страницу:

Встроенные middleware в ASP.NET Core и C# и WelcomePageMiddleware
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850