Freigeben über


MVC puffert bei Verwendung von System.Text.Json keine IAsyncEnumerable-Typen

Model View Controller (MVC) hat in ASP.NET Core 5 die Unterstützung für die Ausgabeformattierung von IAsyncEnumerable<T>-Typen hinzugefügt, indem die Sequenz im Arbeitsspeicher gepuffert und die gepufferte Sammlung formatiert wird. MVC puffert in ASP.NET Core 6 beim Formatieren mithilfe von System.Text.Json keine IAsyncEnumerable<T>-Instanzen mehr. Stattdessen nutzt MVC die Unterstützung, die System.Text.Json für diese Typen hinzugefügt hat.

In den meisten Fällen ist das Fehlen der Pufferung für die Anwendung nicht beobachtbar. Einige Szenarios basierten jedoch möglicherweise versehentlich auf der Puffersemantik für eine richtige Serialisierung. Beispielsweise kann das Zurückgeben einer IAsyncEnumerable<T>-Schnittstelle, die von einer Entity Framework-Abfrage für einen Typ mit verzögert geladenen Eigenschaften unterstützt wird, zu einer gleichzeitigen Abfrageausführung führen, die vom Anbieter möglicherweise nicht unterstützt wird.

Diese Änderung wirkt sich nicht auf die Ausgabeformatierung mit Newtonsoft.Json oder XML-basierten Formatierern aus.

Eingeführt in Version

ASP.NET Core 6.0

Altes Verhalten

IAsyncEnumerable<T>-Instanzen, die von einer MVC-Aktion als Wert zurückgegeben werden, der mithilfe von ObjectResult oder JsonResult formatiert werden soll, werden vor dem Serialisieren als synchrone Sammlung gepuffert.

Neues Verhalten

MVC puffert beim Formatieren mithilfe von System.Text.Json keine IAsyncEnumerable<T>-Instanzen mehr.

Grund für die Änderung

System.Text.Json hat die Unterstützung für das Streamen von IAsyncEnumerable<T>-Typen hinzugefügt. Dies ermöglicht einen geringeren Speicherbedarf bei der Serialisierung.

Wenn für Ihre Anwendung eine Pufferung erforderlich ist, sollten Sie das IAsyncEnumerable<T>-Objekt manuell puffern:

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

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