Sdílet prostřednictvím


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.

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