MVC při použití System.Text.Json neuchovává do vyrovnávací paměti typy IAsyncEnumerable
V ASP.NET Core 5 přidal MVC podporu pro typy formátování IAsyncEnumerable<T> výstupu uložením sekvence do vyrovnávací paměti a formátováním kolekce ve vyrovnávací paměti. V ASP.NET Core 6 už při formátování pomocí System.Text.JsonMVC nedochází k ukládání instancí do vyrovnávací paměti IAsyncEnumerable<T> . Místo toho MVC spoléhá na podporu přidanou System.Text.Json pro tyto typy.
Ve většiněpřípadůch Některé scénáře však mohly neúmyslně spoléhat na sémantiku ukládání do vyrovnávací paměti k správné serializaci. Například vrácení IAsyncEnumerable<T> dotazu Entity Framework na typu s opožděnými vlastnostmi může vést k souběžnému spuštění dotazu, které poskytovatel nemusí podporovat.
Tato změna nemá vliv na formátování výstupu pomocí Newtonsoft.Json nebo s formátovacími moduly založenými na jazyce XML.
Zavedená verze
ASP.NET Core 6.0
Staré chování
IAsyncEnumerable<T> Instance vrácené z akce MVC jako hodnota, která se má formátovat pomocí ObjectResult nebo jsou JsonResult před serializovány jako synchronní kolekce, uloží do vyrovnávací paměti.
Nové chování
Při formátování pomocí System.Text.JsonMVC už nedochází k ukládání instancí do vyrovnávací paměti IAsyncEnumerable<T> .
Důvod změny
System.Text.Json přidání podpory pro typy streamování IAsyncEnumerable<T> . To umožňuje menší nároky na paměť během serializace.
Doporučená akce
Pokud vaše aplikace vyžaduje ukládání do vyrovnávací paměti, zvažte ruční ukládání objektu do IAsyncEnumerable<T> vyrovnávací paměti:
// Before
public IActionResult Get()
{
return Ok(dbContext.Blogs);
}
// After
public async Task<IActionResult> Get()
{
return Ok(await dbContext.Blogs.ToListAsync());
}