MVC ne met pas en mémoire tampon les types IAsyncEnumerable lors de l’utilisation de System.Text.Json
Dans ASP.NET Core 5, MVC a ajouté la prise en charge des types IAsyncEnumerable<T> de mise en forme de sortie en mettant en mémoire tampon la séquence en mémoire et en mettant en forme la collection mise en mémoire tampon. Dans ASP.NET Core 6, lors de la mise en forme à l’aide de System.Text.Json, MVC ne met plus en mémoire tampon les instances IAsyncEnumerable<T>. Au lieu de cela, MVC s’appuie sur le support que System.Text.Json a ajouté pour ces types.
Dans la plupart des cas, l’absence de mise en mémoire tampon n’est pas observable par l’application. Toutefois, certains scénarios peuvent s’être appuyés par inadvertance sur la sémantique de mise en mémoire tampon pour sérialiser correctement. Par exemple, le renvoi d’un IAsyncEnumerable<T> qui est soutenu par une requête Entity Framework sur un type avec des propriétés de chargement différé peut entraîner une exécution simultanée de la requête, qui peut ne pas être prise en charge par le fournisseur.
Ce changement n’affecte pas la mise en forme de la sortie à l’aide de Newtonsoft.Json ou avec des formateurs XML.
Version introduite
ASP.NET Core 6.0
Ancien comportement
Les instances IAsyncEnumerable<T> retournées à partir d’une action MVC en tant que valeur à mettre en forme à l’aide de ObjectResult ou JsonResult sont mises en mémoire tampon avant d’être sérialisées en tant que collection synchrone.
Nouveau comportement
Lors de la mise en forme à l’aide de System.Text.Json, MVC ne met plus en mémoire tampon les instances IAsyncEnumerable<T>.
Raison du changement
System.Text.Json a ajouté le support des types de diffusion en continu IAsyncEnumerable<T>. Cela permet de réduire l’empreinte mémoire pendant la sérialisation.
Action recommandée
Si votre application nécessite une mise en mémoire tampon, envisagez de mettre l’objet IAsyncEnumerable<T> en mémoire tampon manuellement :
// Before
public IActionResult Get()
{
return Ok(dbContext.Blogs);
}
// After
public async Task<IActionResult> Get()
{
return Ok(await dbContext.Blogs.ToListAsync());
}