次の方法で共有


System.Text.Json を使用する場合、MVC で IAsyncEnumerable 型がバッファーに格納されない

ASP.NET Core 5 では、MVC はメモリ内のシーケンスをバッファリングし、バッファーに格納されたコレクションを書式設定することで、 IAsyncEnumerable<T> 型の出力書式設定のサポートを追加しました。 ASP.NET Core 6 では、 System.Text.Jsonを使用して書式設定するときに、MVC はインスタンス IAsyncEnumerable<T> バッファーを作成しなくなりました。 代わりに、MVC はこれらの型に対して System.Text.Json によって追加されたサポートに依存します。

ほとんどの場合、バッファリングがない場合、アプリケーションでは観察できません。 ただし、一部のシナリオでは、正しくシリアル化するためにバッファリング セマンティクスに誤って依存している可能性があります。 たとえば、遅延読み込みプロパティを持つ型に対して Entity Framework クエリによってサポートされる IAsyncEnumerable<T> を返すと、クエリが同時に実行される可能性があり、プロバイダーではサポートされていない可能性があります。

この変更は、Newtonsoft.Json または XML ベースのフォーマッタを使用した出力書式設定には影響しません。

導入されたバージョン

ASP.NET Core 6.0

以前の動作

IAsyncEnumerable<T>またはを使用して書式設定する値として MVC アクションから返されたインスタンスは、同期コレクションとしてシリアル化される前にバッファーされます。

新しい動作

System.Text.Jsonを使用して書式設定する場合、MVC はインスタンスIAsyncEnumerable<T>バッファーしなくなります。

変更の理由

System.Text.Json に、ストリーミング IAsyncEnumerable<T> 型のサポートが追加されました。 これにより、シリアル化中のメモリ 占有領域を小さくできます。

アプリケーションでバッファリングが必要な場合は、 IAsyncEnumerable<T> オブジェクトを手動でバッファリングすることを検討してください。

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

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