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

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

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

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

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

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

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

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

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