Aracılığıyla paylaş


MVC, System.Text.Json kullanırken IAsyncEnumerable türlerini arabelleğe almaz

ASP.NET Core 5'te MVC, diziyi bellekte arabelleğe alarak ve arabelleğe alınan koleksiyonu biçimlendirerek çıkış biçimlendirme IAsyncEnumerable<T> türleri için destek ekledi. ASP.NET Core 6'da, kullanarak System.Text.Jsonbiçimlendirme yapılırken MVC artık örnekleri arabelleğe almaz IAsyncEnumerable<T> . Bunun yerine MVC, bu türler için eklenen desteğe System.Text.Json dayanır.

Çoğu durumda, arabelleğe alma olmaması uygulama tarafından gözlemlenemez. Ancak, bazı senaryolar yanlışlıkla doğru seri hale getirmek için arabelleğe alma semantiğine bağlı olabilir. Örneğin, bir Entity Framework sorgusu tarafından desteklenen bir değerin yavaş yüklenen özelliklere sahip bir türe döndürülmesi IAsyncEnumerable<T> , sağlayıcı tarafından desteklenmeyen eşzamanlı sorgu yürütmeye neden olabilir.

Bu değişiklik, Newtonsoft.Json veya XML tabanlı biçimlendiriciler kullanılarak yapılan çıktı biçimlendirmesini etkilemez.

Sürüm kullanıma sunulmuştur

ASP.NET Core 6.0

Eski davranış

IAsyncEnumerable<T> kullanılarak biçimlendirilecek ObjectResultJsonResult bir değer olarak MVC eyleminden döndürülen örnekler zaman uyumlu koleksiyon olarak seri hale getirilmeden önce arabelleğe alınır.

Yeni davranış

kullanarak System.Text.Jsonbiçimlendirme yaparken MVC artık örnekleri arabelleğe almaz IAsyncEnumerable<T> .

Değişiklik nedeni

System.Text.Json akış IAsyncEnumerable<T> türleri için destek eklendi. Bu, serileştirme sırasında daha küçük bir bellek ayak izi sağlar.

Uygulamanız arabelleğe almayı gerektiriyorsa nesneyi el ile arabelleğe almayı IAsyncEnumerable<T> göz önünde bulundurun:

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

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