다음을 통해 공유


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

이전 동작

ObjectResult 또는 JsonResult를 사용하여 형식을 지정할 값으로 MVC 작업에서 반환된 IAsyncEnumerable<T> 인스턴스는 동기 컬렉션으로 직렬화되기 전에 버퍼링됩니다.

새 동작

System.Text.Json을 사용하여 형식을 지정하는 경우 MVC가 더 이상 IAsyncEnumerable<T> 인스턴스를 버퍼링하지 않습니다.

변경 이유

System.Text.JsonIAsyncEnumerable<T> 형식을 스트리밍하기 위한 지원이 추가되었습니다. 따라서 직렬화하는 중 메모리 공간을 더 적게 차지할 수 있습니다.

애플리케이션에 버퍼링이 필요한 경우 IAsyncEnumerable<T> 개체를 수동으로 버퍼링하는 것이 좋습니다.

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

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