Udostępnij za pośrednictwem


Funkcja MVC nie buforuje typów IAsyncEnumerable w przypadku korzystania z pliku System.Text.Json

W ASP.NET Core 5 mvC dodał obsługę typów formatowania IAsyncEnumerable<T> danych wyjściowych przez buforowanie sekwencji w pamięci i formatowanie buforowanej kolekcji. W ASP.NET Core 6 podczas formatowania przy użyciu klasy System.Text.JsonMVC nie buforuje IAsyncEnumerable<T> już wystąpień. Zamiast tego mvC opiera się na obsłudze dodanej System.Text.Json dla tych typów.

W większości przypadków brak buforowania nie będzie widoczny przez aplikację. Jednak niektóre scenariusze mogły przypadkowo polegać na semantyce buforowania w celu poprawnej serializacji. Na przykład zwrócenie kwerendy IAsyncEnumerable<T> opartej na platformie Entity Framework dla typu z właściwościami ładowanymi z opóźnieniem może spowodować współbieżne wykonanie zapytania, co może nie być obsługiwane przez dostawcę.

Ta zmiana nie ma wpływu na formatowanie danych wyjściowych przy użyciu formatu Newtonsoft.Json lub formatów opartych na formacie XML.

Wprowadzona wersja

ASP.NET Core 6.0

Stare zachowanie

IAsyncEnumerable<T> wystąpienia zwracane z akcji MVC jako wartości do sformatowania przy użyciu ObjectResult lub JsonResult są buforowane przed serializacji jako kolekcja synchroniczna.

Nowe zachowanie

Podczas formatowania przy użyciu klasy System.Text.JsonMVC wystąpienia nie buforują IAsyncEnumerable<T> już wystąpień.

Przyczyna wprowadzenia zmiany

System.Text.Json dodano obsługę typów przesyłania strumieniowego IAsyncEnumerable<T> . Pozwala to na mniejsze zużycie pamięci podczas serializacji.

Jeśli aplikacja wymaga buforowania, rozważ ręczne buforowanie IAsyncEnumerable<T> obiektu:

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

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