在 ASP.NET Core 5 中,MVC 通过在内存中缓冲序列并格式化缓冲集合,添加了对输出格式类型的 IAsyncEnumerable<T> 支持。 在 ASP.NET Core 6 中,使用 System.Text.Json格式设置时,MVC 不再缓冲 IAsyncEnumerable<T> 实例。 相反,MVC 依赖于 System.Text.Json 为这些类型添加的支持。
在大多数情况下,应用程序无法检测到缓冲的缺失。 但是,某些方案可能无意中依赖于缓冲语义来正确序列化。 例如,在具有延迟加载属性的类型上返回由实体框架查询支持的 IAsyncEnumerable<T> 可能会导致并发查询执行,提供程序可能不支持这种情况。
此更改不会影响使用 Newtonsoft.Json 或基于 XML 的格式化程序进行输出格式设置。
已引入的版本
ASP.NET Core 6.0
旧行为
IAsyncEnumerable<T> 从 MVC 操作返回的实例在作为 ObjectResult 或 JsonResult 的格式化值进行缓冲后,再序列化为同步集合。
新行为
使用 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());
}