Жизненный цикл запроса в ASP.NET Core MVC 3. Продолжение
Начало
Промежуточное ПО
Маршрутизация
Инициализация контроллера
Наконец запрос попадает во фреймворк MVC. Здесь под фреймворком понимается набор контроллеров с методами действий, фильтров и представлений Razor.
Для начала рассмотрим два важных класса.
Первый называется инициатором действий контроллера (Controller Action Invoker) и наследуется от второго абстрактного класса – инициатора ресурсов (Resource Invoker). Эти классы управляют конвейером MVC (см. картинку ниже). Делегат запроса в промежуточном ПО конечных точек передаёт данные контекста HTTP-запроса и выбранного метода действия в инициатор действий контроллера и его родительский класс. Логика инициатора ресурсов сначала выполняет фильтры авторизации, ресурсов и промежуточного ПО, чтобы понять, нужно ли вообще создавать контроллер. Если нужно, фабрика контроллеров, использует контекстные данные, предоставленные вызывающей стороной, для создания экземпляра контроллера. Затем инициируется поток исполнения соответствующего метода действия этого экземпляра контроллера. Когда метод действия возвращает результат, инициатор ресурсов выполняет результат для генерации ответа.
Фильтры
Фильтры - позволяют внедрять пользовательский код на различных этапах жизненного цикла запроса. MVC «из коробки» включает несколько встроенных фильтров, но мы также можем легко написать свои. Выполнение фильтров управляется инициатором действий контроллера, который вставляет их код в различные этапы конвейера MVC. Их место в жизненном цикле запроса определяется их типом:
1. Фильтры авторизации, ресурсов и промежуточного ПО выполняются перед созданием контроллера. То есть эти фильтры могут решить, должен ли запрос отправляться дальше по конвейеру или его следует прервать (например, при неудачной авторизации).
2. Фильтры действий и результатов действий запускаются до и после выполнения метода действия и результата соответственно.
3. Фильтры исключений могут выполняться в любом месте конвейера.
Фильтры постоянно добавлялись в MVC с ранних версий, поэтому в .NET Core 3 их довольно много. С фильтрами авторизации, действий и исключений всё более-менее понятно. Рассмотрим подробнее редко используемые фильтры ресурсов и промежуточного ПО.
Фильтры ресурсов реализуют интерфейс
IResourceFilter, определяющий два метода OnResourceExecuting и OnResourceExecuted. Фильтры ресурсов уникальны тем, что они оборачивают выполнение большей части конвейера MVC. Это первое место для внедрения пользовательской логики после авторизации (OnResourceExecuting) и последнее место перед тем, как MVC вернёт ответ (OnResourceExecuted). В некотором смысле фильтры ресурсов похожи на промежуточное ПО внутри конвейера MVC. С их помощью можно выполнять кэширование или управлять поведением привязки модели.Фильтры промежуточного ПО позволяют запускать стандартные компоненты промежуточного ПО внутри конвейера MVC. Есть две основные причины их использования:
- повторное использование логики компонента промежуточного ПО;
- предоставление компоненту промежуточного ПО большего объёма данных контекста изнутри MVC, чем это возможно на этапе выполнения промежуточного ПО.
Фильтры промежуточного ПО выполняются после фильтров авторизации, но на той же общей стадии, что и фильтры ресурсов.
Продолжение следует…
Источник: https://app.pluralsight.com/library/courses/aspnet-core-3-mvc-request-life-cycle/