Во многих API до сих пор пишут методы вида
public IEnumerable<OrderDto> GetOrders() и думают что это ленивый возврат данных. На деле фреймворк вынужден сначала полностью пройти по IEnumerable, собрать коллекцию, а уже потом целиком сериализовать ее в JSON и отправить в сеть.Большой список целиком оказывается в куче, всплеск аллокаций ускоряет сборку мусора, а клиент ждет первый байт до тех пор пока не будет готов весь массив данных.
В современных версиях .NET намного безопаснее отдавать последовательность как
IAsyncEnumerable<T>. В этом случае ASP.NET может сериализовать элементы по мере их появления и выводить их в ответ потоком вместо полной буферизации результата. Альтернативный вариант — явно использовать
Results.Stream и JsonSerializer.SerializeAsync(stream, data) чтобы отдать JSON как поток байтов и держать в памяти лишь небольшой кусок данных.📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#il_люминатор
