Compartilhar via


O MVC não armazenará em buffer os tipos IAsyncEnumerable ao usar System.Text.Json

No ASP.NET Core 5, o MVC adicionou suporte para formatos de saída IAsyncEnumerable<T> armazenando a sequência na memória e formatando a coleção armazenada. No ASP.NET Core 6, ao utilizar System.Text.Json para formatar, o MVC não armazena mais instâncias IAsyncEnumerable<T> em buffer. Em vez disso, o MVC depende do suporte que System.Text.Json adicionou para esses tipos.

Na maioria dos casos, a ausência de buffer não seria observável pelo aplicativo. No entanto, alguns cenários podem ter inadvertidamente confiado na semântica de buffer para serializar corretamente. Por exemplo, retornar uma IAsyncEnumerable<T> que seja baseada em uma consulta do Entity Framework em um tipo com propriedades carregadas lentamente pode resultar na execução simultânea de consultas, o que pode não ser suportado pelo provedor.

Essa alteração não afeta a formatação de saída usando Newtonsoft.Json ou com formatadores baseados em XML.

Versão introduzida

ASP.NET Core 6.0

Comportamento antigo

As instâncias IAsyncEnumerable<T> retornadas de uma ação do MVC como um valor a ser formatado usando ObjectResult ou um JsonResult serão armazenadas em buffer antes de serem serializadas como uma coleção síncrona.

Novo comportamento

Ao formatar usando System.Text.Json, o MVC não armazena mais instâncias IAsyncEnumerable<T> em buffer.

Motivo da alteração

System.Text.Json adicionou suporte para tipos de streaming IAsyncEnumerable<T>. Isso permite um volume de memória menor durante a serialização.

Se o seu aplicativo requer bufferização, considere a bufferização manual do objeto IAsyncEnumerable<T>.

// Before
public IActionResult Get()
{
    return Ok(dbContext.Blogs);
}

// After
public async Task<IActionResult> Get()
{
    return Ok(await dbContext.Blogs.ToListAsync());
}