При создании приложения ASP.NET Core вы можете использовать различные компоненты ПО промежуточного слоя для проверки, маршрутизации или изменения сообщений запросов и ответов, проходящих через конвейер. Вы также можете написать собственное ПО промежуточного слоя в ASP.NET Core.
Обычно у вас есть цепочка компонентов промежуточного слоя в конвейере приложения в ASP.NET Core. В этой статье мы рассмотрим ПО промежуточного слоя в ASP.NET Core и то, как мы можем работать с подходами на основе соглашений и фабрик.
Чтобы использовать примеры кода, представленные в этой статье, в вашей системе должна быть установлена Visual Studio 2022. Если у вас еще нет копии, вы можете скачать Visual Studio 2022 здесь.
Создайте проект веб-API ASP.NET Core 7 в Visual Studio 2022.
Прежде всего, давайте создадим проект ASP.NET Core 7 в Visual Studio 2022. Выполните следующие действия:
- Запустите интегрированную среду разработки Visual Studio 2022.
- Нажмите «Создать новый проект».
- В окне «Создать новый проект» выберите «ASP.NET Core Web API» из списка отображаемых шаблонов.
- Нажмите “Далее.
- В окне «Настроить новый проект» укажите имя и расположение нового проекта.
- При желании установите флажок «Поместить решение и проект в один каталог», в зависимости от ваших предпочтений.
- Нажмите “Далее.
- В следующем окне «Дополнительная информация» оставьте флажок «Использовать контроллеры (снимите флажок, чтобы использовать минимальное количество API)». В этом проекте мы не будем использовать минимальные API. Оставьте для параметра «Тип аутентификации» значение «Нет» (по умолчанию).
- Убедитесь, что флажки «Включить поддержку Open API», «Настроить для HTTPS» и «Включить Docker» не отмечены, так как мы не будем использовать эти функции здесь.
- Щелкните Создать.
Мы будем использовать этот проект веб-API ASP.NET Core 7 для работы с заводской активацией промежуточного ПО в следующих разделах.
Понимание промежуточного ПО в ASP.NET Core
ПО промежуточного слоя — это программные компоненты, составляющие конвейер обработки запросов и ответов в ASP.NET Core. Входящие запросы проходят через каждый компонент промежуточного слоя в конвейере, и каждый из этих компонентов может либо обработать запрос, либо направить его следующему компоненту в конвейере.
Программное обеспечение промежуточного слоя может выполнять множество функций, включая аутентификацию, авторизацию, ведение журналов, обработку исключений, маршрутизацию, кэширование и сжатие ответов. Вы можете разбить функциональность своего приложения на отдельные компоненты и добавить, удалить или изменить промежуточное ПО, чтобы адаптировать конвейер обработки запросов и ответов к вашему приложению.
Традиционно вам приходилось настраивать компоненты промежуточного программного обеспечения с помощью метода расширения UseMiddleware в классе Startup или файла Program.cs при использовании более новой версии ASP.NET Core. Напротив, активация ПО промежуточного слоя на основе фабрики позволяет определять и настраивать компоненты ПО промежуточного слоя с помощью фабрик, что обеспечивает большую гибкость при активации.
Обратите внимание, что если вы не напишете собственный класс фабрики промежуточного программного обеспечения, будет использоваться фабрика промежуточного программного обеспечения по умолчанию. В ASP.NET Core ПО промежуточного слоя можно активировать двумя различными способами: активация ПО промежуточного слоя на основе соглашений и активация ПО промежуточного слоя на заводе. Давайте теперь рассмотрим оба подхода.
Программное обеспечение промежуточного слоя на основе соглашений в ASP.NET Core
Активация ПО промежуточного слоя на основе соглашений в ASP.NET Core — это функция, которая позволяет автоматически применять ПО промежуточного слоя к конвейеру запросов и ответов на основе предопределенных соглашений, а не явно настраивать каждый компонент ПО промежуточного слоя. В следующем листинге кода показано, как можно создать компонент промежуточного программного обеспечения на основе соглашений.
public class ConventionalMiddleware { private readonly RequestDelegate _next; public ConventionalMiddleware(RequestDelegate next) => _next = next; public async Task InvokeAsync(HttpContext context) { Trace.WriteLine("Inside the Conventional Middleware."); await _next(context); } }
Вы можете добавить это ПО промежуточного слоя в конвейер обработки запросов, используя следующий фрагмент кода в файле Program.cs.
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.UseMiddleware<ConventionalMiddleware>(); app.Run();
Заводское ПО промежуточного слоя в ASP.NET Core
Фабричная активация промежуточного ПО в ASP.NET Core обеспечивает более гибкий и динамичный способ настройки и активации компонентов промежуточного ПО. Активация ПО промежуточного слоя на заводе позволяет настроить процесс создания экземпляров ПО промежуточного слоя в соответствии с потребностями вашего приложения.
Программное обеспечение промежуточного слоя на основе фабрики позволяет вам внедрять зависимости с ограниченным временем жизни с помощью конструктора класса вашего промежуточного программного обеспечения — функция, не поддерживаемая промежуточным программным обеспечением, основанным на соглашениях. Время жизни с заданной областью означает, что служба создается один раз для каждого запроса клиента и удаляется в конце запроса.
Промежуточное ПО на основе фабрики имеет следующие преимущества по сравнению с промежуточным ПО в традиционном стиле или на основе соглашений:
- ПО промежуточного слоя на основе соглашений создается один раз при запуске приложения ASP.NET Core, ПО промежуточного слоя на основе фабрики создается при каждом запросе.
- Поскольку ПО промежуточного слоя на основе фабрики обеспечивает поддержку активации по запросу, вы можете внедрить сервисы с заданной областью в конструктор ПО промежуточного слоя.
- Программное обеспечение промежуточного слоя на основе фабрики способствует строгой типизации типа промежуточного программного обеспечения.
Чтобы использовать заводскую активацию промежуточного программного обеспечения, необходимо выполнить четыре шага, описанных ниже.
- Создайте класс, представляющий компонент промежуточного программного обеспечения и реализующий интерфейс IMiddleware.
- Реализуйте метод InvokeAsync в своем промежуточном программном обеспечении, который определяет логику для промежуточного программного обеспечения.
- Добавьте ПО промежуточного слоя в контейнер внедрения зависимостей с помощью метода AddSingleton или AddScoped.
- Настройте конвейер ПО промежуточного слоя, используя метод расширения UseMiddleware и указав тип компонента ПО промежуточного слоя.
В следующем листинге кода показано, как можно написать компонент промежуточного программного обеспечения на основе фабрики.
public class FactoryActivatedMiddleware : IMiddleware { public async Task InvokeAsync(HttpContext context, RequestDelegate next) { Trace.WriteLine("Inside the Factory Activated Middleware."); await next.Invoke(context); } }
Вы должны зарегистрировать промежуточное ПО в контейнере сервисов, используя следующий фрагмент кода.
var builder = WebApplication.CreateBuilder(args); builder.Services.AddTransient<FactoryActivatedMiddleware>();
Теперь вы можете добавить это промежуточное ПО почти так же, как мы добавляли промежуточное ПО в примере с промежуточным ПО на основе соглашений.
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.UseMiddleware<FactoryActivatedMiddleware>(); app.Run();
Каждый вызов метода расширения UseMiddleware проверяет, соответствует ли рассматриваемая реализация промежуточного программного обеспечения интерфейсу IMiddleware. Если это условие выполнено, экземпляр IMiddlewareFactory, зарегистрированный в контейнере службы, используется для разрешения реализации интерфейса IMiddleware вместо реализации промежуточного программного обеспечения на основе соглашений. Это ПО промежуточного слоя регистрируется как временная или ограниченная служба в контейнере служб.
Интерфейс IMiddlewareFactory определяет два метода, а именно методы Create(Type) и Release(IMiddleware). В то время как метод Create(Type) используется для создания экземпляра ПО промежуточного слоя для каждого запроса, метод Release(IMiddleware) выпускает экземпляр IMiddleware в конце запроса. Реализация IMiddlewareFactory по умолчанию доступна в классе Microsoft.AspNetCore.Http.MiddlewareFactory.