Что такое middleware в ASP.NET core
Middleware в ASP.NET Core — это программные компоненты, которые участвуют в обработке каждого HTTP-запроса и ответа, образуя конвейер. Каждый компонент может выполнять действия до и после передачи управления следующему компоненту, что позволяет добавлять сквозную функциональность, такую как аутентификация, логирование, обработка ошибок и работа со статическими файлами.
Как это работает
Middleware организованы в виде конвейера (pipeline). Когда приложение получает HTTP-запрос, он последовательно проходит через все зарегистрированные компоненты. Каждый middleware получает объект HttpContext, содержащий информацию о запросе и ответе, и может:
- Обработать запрос до вызова следующего компонента.
- Передать управление следующему компоненту через
RequestDelegate. - Обработать ответ после того, как последующие компоненты завершили работу.
Порядок регистрации middleware в конвейере определяет порядок их выполнения. Компоненты, зарегистрированные раньше, выполняются первыми при обработке запроса и последними при обработке ответа.
Пример
Создание собственного middleware обычно включает класс с конструктором, принимающим RequestDelegate, и метод InvokeAsync (или Invoke), который вызывается для каждого запроса. Пример простого middleware, логирующего время обработки:
public class LoggingMiddleware
{
private readonly RequestDelegate _next;
public LoggingMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
// Действия до передачи управления следующему компоненту
var start = DateTime.UtcNow;
Console.WriteLine($"Запрос: {context.Request.Path} в {start}");
await _next(context); // Передача управления следующему middleware
// Действия после обработки запроса последующими компонентами
var duration = DateTime.UtcNow - start;
Console.WriteLine($"Ответ: {context.Response.StatusCode} за {duration.TotalMilliseconds} мс");
}
}Регистрация middleware в классе Startup (или в Program.cs для минимального хостинга) выполняется в методе Configure с помощью UseMiddleware<T>() или встроенных методов расширения:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseMiddleware<LoggingMiddleware>();
// Другие middleware, например:
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
}Подводные камни
- Порядок регистрации критичен. Например,
UseAuthenticationдолжен быть вызван доUseAuthorization, иначе авторизация не будет работать корректно. - Не забывайте вызывать
_next(context). Если middleware не передаст управление дальше, конвейер оборвётся, и запрос не будет обработан последующими компонентами. - Исключения в middleware могут быть перехвачены только теми компонентами, которые находятся выше по конвейеру. Поэтому обработку ошибок обычно размещают первым.
- Не выполняйте тяжёлые операции в middleware без необходимости, так как они выполняются для каждого запроса и могут снизить производительность.
Когда использовать
Middleware подходит для задач, которые должны выполняться для всех или большинства запросов: аутентификация, логирование, обработка ошибок, сжатие ответов, обслуживание статических файлов. Встроенные middleware в ASP.NET Core покрывают многие типовые сценарии, но при необходимости легко создать собственный компонент.
Коротко
- Middleware — это компоненты конвейера обработки HTTP-запросов в ASP.NET Core.
- Каждый middleware может выполнять код до и после вызова
_next(context). - Порядок регистрации в
Configureопределяет порядок выполнения. - Используется для сквозных задач: логирование, аутентификация, обработка ошибок, статические файлы.
