Поделиться через


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());
}