Простой регистратор запросов
Попробуйте вместо этого ...
app.Use(async (HttpContext context, Func<Task> next) =>
{
if (context== null) throw new ArgumentNullException(nameof(context));
var sw = Stopwatch.StartNew();
try
{
await next(context);
sw.Stop();
// do your logging work here
// for example
if (httpContext.Response?.StatusCode > 499)
{
// 500+ error code is a server error
// log the error
}
}
catch (Exception ex) when (LogException(context, sw, ex))
{
// never caught, because `LogException()` returns false.
}
}
и затем добавьте этот статический метод
static bool LogException(HttpContext context, Stopwatch sw, Exception ex)
{
sw.Stop();
// log the exception
return false;
}
конвейер запросов
Чтобы ответить на ваш вопрос более прямо, а не просто дать вам блок кода. Я считаю, что вы неправильно понимаете, как ведет себя конвейер запросов. Я постараюсь объяснить это с помощью вашего кода.
app.Use(async (HttpContext context, Func<Task> next) =>
{
// every single request is currently hitting this middleware
// even regardless if the URI "exists" or not.
// to solve this you need to define what is a valid URI
// for example, validate the path
if (context.Request.Path != "foo")
{
return next(); // break out
}
// if we got this far, that means it was a valid URI
var timer = new Stopwatch();
timer.Start();
await next();
timer.Stop();
// do work
});
Надеюсь, это иллюстрирует, как работает конвейер.
Конвейер запросов выполняется в указанном вами порядке. На данный момент в вашем текущем коде нет ничего, что определяло бы что такое "действительный" URI .