Приведи пример middleware для вычисления времени выполнения запроса в ASP.NET Core

«Приведи пример middleware для вычисления времени выполнения запроса в ASP.NET Core» — вопрос из категории ASP.NET Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Middleware в ASP.NET Core идеально подходит для перехвата и измерения времени выполнения запросов. Вот практический пример, который добавляет заголовок с длительностью в ответ.

Реализация middleware:

public class RequestTimingMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<RequestTimingMiddleware> _logger;

    public RequestTimingMiddleware(RequestDelegate next, ILogger<RequestTimingMiddleware> logger)
    {
        _next = next;
        _logger = logger;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        var stopwatch = Stopwatch.StartNew();

        // Вызов следующего компонента в конвейере
        await _next(context);

        stopwatch.Stop();

        // Добавляем время в заголовок ответа
        context.Response.Headers.Append("X-Request-Duration-ms", stopwatch.ElapsedMilliseconds.ToString());

        // Логируем для анализа
        _logger.LogDebug("Request to {Path} completed in {ElapsedMs} ms", 
            context.Request.Path, stopwatch.ElapsedMilliseconds);
    }
}

Регистрация в Program.cs:

var builder = WebApplication.CreateBuilder(args);
// ... конфигурация сервисов

var app = builder.Build();

// Регистрируем middleware на раннем этапе конвейера,
// чтобы замерить всё время обработки.
app.UseMiddleware<RequestTimingMiddleware>();

// ... остальная конфигурация конвейера (аутентификация, авторизация, контроллеры)
app.Run();

Ключевые моменты и best practices:

  1. Используйте Stopwatch, а не DateTime, для высокой точности измерений.
  2. Позиция в конвейере критична. Размещение middleware до других компонентов (UseRouting, UseAuthentication) позволяет измерить полное время, включая их работу.
  3. Добавление в заголовки (X-Request-Duration-ms) удобно для клиентов и систем мониторинга (например, для анализа в браузере или через прокси).
  4. Логирование (через ILogger) необходимо для сбора метрик на стороне сервера и последующего анализа в таких системах, как Seq, Elasticsearch или Application Insights.
  5. Для продакшена рассмотрите использование специализированных библиотек (например, AppMetrics или OpenTelemetry), которые предоставляют более богатые возможности для сбора и визуализации метрик производительности.