Ответ
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:
- Используйте
Stopwatch, а неDateTime, для высокой точности измерений. - Позиция в конвейере критична. Размещение middleware до других компонентов (
UseRouting,UseAuthentication) позволяет измерить полное время, включая их работу. - Добавление в заголовки (
X-Request-Duration-ms) удобно для клиентов и систем мониторинга (например, для анализа в браузере или через прокси). - Логирование (через
ILogger) необходимо для сбора метрик на стороне сервера и последующего анализа в таких системах, как Seq, Elasticsearch или Application Insights. - Для продакшена рассмотрите использование специализированных библиотек (например,
AppMetricsилиOpenTelemetry), которые предоставляют более богатые возможности для сбора и визуализации метрик производительности.