MVC non memorizza nel buffer i tipi IAsyncEnumerable quando si usa System.Text.Json
In ASP.NET Core 5 MVC ha aggiunto il supporto per la formattazione dell'output dei tipi IAsyncEnumerable<T> memorizzando nel buffer la sequenza in memoria e formattando la raccolta memorizzata nel buffer. In ASP.NET Core 6, quando si formatta usando System.Text.Json, MVC non memorizza più nel buffer le istanze IAsyncEnumerable<T>. MVC si basa invece sul supporto che System.Text.Json ha aggiunto per questi tipi.
Nella maggior parte dei casi, l'assenza di buffering non sarebbe osservabile dall'applicazione. Tuttavia, alcuni scenari potrebbero essersi inavvertitamente basati sulla semantica di buffering per serializzare correttamente. Ad esempio, la restituzione di un oggetto IAsyncEnumerable<T> supportato da una query di Entity Framework su un tipo con proprietà con caricamento differita può comportare l'esecuzione di query simultanee, che potrebbero non essere supportate dal provider.
Questa modifica non influisce sulla formattazione dell'output usando Newtonsoft.Json o con formattatori basati su XML.
Versione introdotta
ASP.NET Core 6.0
Comportamento precedente
IAsyncEnumerable<T> istanze restituite da un'azione MVC come valore da formattare tramite ObjectResult o un JsonResult vengono memorizzate nel buffer prima di essere serializzate come raccolta sincrona.
Nuovo comportamento
Quando si formatta usando System.Text.Json, MVC non memorizza più nel buffer le istanze IAsyncEnumerable<T>.
Motivo della modifica
System.Text.Json ha aggiunto il supporto per i tipi di streaming IAsyncEnumerable<T>. Ciò consente un footprint di memoria inferiore durante la serializzazione.
Azione consigliata
Se l'applicazione richiede il buffering, valutare la possibilità di memorizzare manualmente l'oggetto IAsyncEnumerable<T> nel buffer:
// Before
public IActionResult Get()
{
return Ok(dbContext.Blogs);
}
// After
public async Task<IActionResult> Get()
{
return Ok(await dbContext.Blogs.ToListAsync());
}