Веб-версияОткрыть в Telegram

ПостДень 2777. #ЗаметкиНаПолях

7 сентября 2026
.
.NET Разработчик
День 2777. #ЗаметкиНаПолях Конечные Точки в ASP.NET Core не Имеют Таймаута ASP.NET Core по умолчанию не применяет таймаут приложения к входящим запросам. Встроенное промежуточное ПО для таймаута запроса добавляет дедлайн, но вызывает только HttpContext.RequestAborted. Конечная точка должна передать этот токен в операцию, которую вы хотите остановить. Медленный запрос к БД или зависший вызов API могут продолжать потреблять ресурсы даже после того, как ответ перестанет быть полезным. В .NET 8 было введено промежуточное ПО для таймаута запроса, чтобы обеспечить кооперативный дедлайн обработки. Зарегистрируем промежуточное ПО и установим тайм-аут в Program.cs: var builder = WebApplication.CreateBuilder(args); builder.Services.AddRequestTimeouts(); var app = builder.Build(); app.UseRequestTimeouts(); app.MapGet("/reports", async ( CancellationToken ct) => { await Task.Delay(TimeSpan.FromSeconds(10), ct); return Results.Ok("Ready"); }) .WithRequestTimeout(TimeSpan.FromSeconds(3)); app.Run(); - AddRequestTimeouts только регистрирует необходимые сервисы, но не устанавливает ограничение. - WithRequestTimeout задаёт для конечной точки 3-секундный таймаут. Минимальные API привязывают параметр CancellationToken к HttpContext.RequestAborted. - Через 3 секунды Task.Delay обнаруживает отмену и генерирует исключение. Если это исключение достигает промежуточного ПО до начала ответа, ответ по умолчанию — пустой 504 Gateway Timeout. * Тестируйте это без отладчика, т.к. при подключенном отладчике таймаут не срабатывает. Токен должен достичь отменяемой работы Промежуточное ПО таймаута не прерывает поток и не вызывает HttpContext.Abort(). Оно отменяет токен и продолжает ждать конечную точку. Удалите ct из вызова Task.Delay выше, и обработчик будет ждать полные 10 секунд, прежде чем вернуть 200 OK. Ошибка 504 не возникает, т.к. исключение отмены не достигает промежуточного ПО. То же правило применяется и к реальным зависимостям. Передавайте токен через сервисы приложения в EF Core: public Task<Order?> GetByIdAsync( Guid id, CancellationToken ct) { return dbContext.Orders .AsNoTracking() .SingleOrDefaultAsync( order => order.Id == id, ct); } EF Core пересылает токен провайдеру БД, который решает, можно ли отменить операцию в БД. Токен должен пройти по всей цепочке вызовов, прежде чем провайдер сможет его увидеть (см. также: ошибки при передаче токена отмены). Передавайте токен в HttpClient, клиенты обмена сообщениями и другие асинхронные операции, где безопасно отказаться от операции. Выберите таймауты для каждой конечной точки Не все конечные точки должны иметь одинаковый лимит. Небольшое чтение из API и экспорт отчёта имеют разные дедлайны, поэтому задайте для них разные политики: builder.Services.AddRequestTimeouts(opts => { opts.AddPolicy("short", TimeSpan.FromSeconds(3)); opts.AddPolicy("long", TimeSpan.FromSeconds(30)); }); app.MapGet("/orders/{id:guid}", GetOrder) .WithRequestTimeout("short"); app.MapGet("/reports/{id:guid}", ExportReport) .WithRequestTimeout("long"); app.MapGet("/events", StreamEvents) .DisableRequestTimeout(); Для событий Server-Sent, Web-сокетов, long pooling и больших загрузок обычно требуется более длительная политика таймаутов или метод .DisableRequestTimeout(). Итого Ошибка 504 от промежуточного ПО таймаута означает, что отмена достигла его. Это не значит, что все нижележащие операции были остановлены. Передавайте токен отмены во все нижележащие операции. Используйте логи или трассировку, чтобы убедиться, что зависимости обработали отмену. Источник: https://milanjovanovic.tech/blog/your-aspnetcore-endpoints-dont-have-a-timeout
22 · 1.6K ·

Рядом в ленте

..NET РазработчикДень 2775. #Оффтоп Сортировка I-Can’t-Believe-It-Can-Sort Думаю, что с каждым чуть ли не ежедневно случается ситуация, когда вы написали код и думаете, что он р..NET РазработчикДень 2776. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как технических, так и на софт-скилы), которые могут задать на собеседовании.
это сообщение
..NET РазработчикДень 2778. #ЗаметкиНаПолях Потоковая Передача JSON в .NET. Начало Допустим, у вас есть конечная точка, которая возвращает список: все заказы за последний кварта..NET РазработчикДень 2779. #ЧтоНовенького #NET11 Потоковая Передача JSON в .NET 11. Окончание Начало JSON-строки: один объект на строку JSON-строки (или NDJSON - Newline Delimi
..NET Разработчик.NET Разработчик@NetDeveloperDiary · канал · Технологии
6 750подписчиков1 355средний охват поста
Лента площадки Открыть в Telegram

Открытая публичная лента из поискового индекса ChatCrawler — «Google по публичному Telegram»; обновляется по мере обхода площадки. Время — UTC.

Только публичный контент, официальный API Telegram. О проекте · Вопросы · Чего мы не делаем · Убрать страницу из выдачи · Каталог · Поиск · Как мы считаем