MVC не помещает в буфер типы IAsyncEnumerable при использовании System.Text.Json
В ASP.NET Core 5 в MVC добавлена поддержка выходных типов форматирования IAsyncEnumerable<T> путем буферизации последовательности в памяти и форматирования буферизованной коллекции. В ASP.NET Core 6 при форматировании с помощью System.Text.Json MVC больше не помещает экземпляры IAsyncEnumerable<T> в буфер. Вместо этого MVC использует поддержку, добавленную в пространство имен System.Text.Json для этих типов.
В большинстве случаев в приложении не будет заметно отсутствие буферизации. Однако некоторые сценарии для корректной сериализации могут непреднамеренно полагаться на семантику буферизации. Например, возврат интерфейса IAsyncEnumerable<T>, поддерживаемого запросом Entity Framework к типу со свойствами с отложенной загрузкой, может привести к параллельному выполнению запросов, которое может не поддерживаться поставщиком.
Это изменение не влияет на форматирование выходных данных с помощью Newtonsoft.Json или средств форматирования XML.
Представленные версии
ASP.NET Core 6.0
Старое поведение
Экземпляры IAsyncEnumerable<T>, возвращаемые действием MVC в виде значения, которое необходимо отформатировать с помощью ObjectResult или JsonResult, помещаются в буфер до сериализации в виде синхронной коллекции.
Новое поведение
При форматировании с помощью System.Text.Json MVC больше не помещает экземпляры IAsyncEnumerable<T> в буфер.
Причина изменения
В пространство имен System.Text.Json добавлена поддержка типов потоковой передачи IAsyncEnumerable<T>. Это позволяет уменьшить используемый объем памяти во время сериализации.
Рекомендуемое действие
Если приложению требуется буферизация, рассмотрите возможность помещения объекта IAsyncEnumerable<T> в буфер вручную.
// Before
public IActionResult Get()
{
return Ok(dbContext.Blogs);
}
// After
public async Task<IActionResult> Get()
{
return Ok(await dbContext.Blogs.ToListAsync());
}