.NET Core: 3 ловушкиMiddleware — звено HTTP pipeline:
app.Use(async (context, next) =>
{
Console.WriteLine("Request");
await next(context);
Console.WriteLine("Response");
});
1️⃣ Забыл next() — остановил pipeline
await _next(context);
Если его не вызвать, middleware ниже и endpoint не выполнятся.
2️⃣ Scoped-сервис не стоит инжектить в конструктор
Middleware переиспользуется между запросами, поэтому Scoped лучше получать в InvokeAsync:
public async Task InvokeAsync(
HttpContext context,
IMyScopedService service)
{
await _next(context);
}
3️⃣ После начала ответа менять его уже нельзя
await _next(context);
context.Response.StatusCode = 503; // 💥
Если response уже отправляется, будет InvalidOperationException.
💡 Для действий до отправки используйте Response.OnStarting().
И ещё: не передавайте scoped-сервис в Task.Run после завершения запроса — его scope уже мог быть уничтожен. Для фоновой работы создавайте новый scope или используйте BackgroundService 🧠
🔗 Источник
📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#il_люминатор