[英]ASP.NET Core 6 - Async streaming along with additional metadata
ASP.NET Core 现在支持从控制器操作一直到响应 JSON 格式化程序的异步流。 从操作返回IAsyncEnumerable
不再在响应内容被发送之前缓冲内存中的内容。 这有助于在返回可以异步枚举的大型数据集时减少内存使用。
由于DbSet
实现了IAsyncEnumerable
,因此完全支持以下示例:
[ApiController]
public class Controller : ControllerBase
{
private readonly DbContext _context;
public Controller(DbContext context) => _context = context;
[HttpGet]
public IAsyncEnumerable<AspNetUser> GetData()
{
return _context.AspNetUsers.AsAsyncEnumerable();
}
}
看似只有在返回数据源本身时才能使用此功能,但是当数据源被包装,以便可以发送额外的元数据时,流式传输是不可能的。
基本API结果:
public class DataSourceResult<T>
{
public IEnumerable<T> Data { get; set; }
public int PageIndex { get; set; }
public int PageSize { get; set; }
public int TotalCount { get; set; }
}
由于我的许多应用程序都在低内存环境中运行,我正在寻找如何在间接返回数据的情况下利用异步流的想法。
您需要做的就是将DataSourceResult<T>
类更改为具有IAsyncEnumerable<T>
的Data
属性类型。 System.Text.Json
序列化器识别类型并将其流式传输到客户端。 所以:
public class DataSourceResult<T>
{
public IAsyncEnumerable<T> Data { get; set; }
public int PageIndex { get; set; }
public int PageSize { get; set; }
public int TotalCount { get; set; }
}
你的行动将是这样的:
public DataSourceResult<AspNetUser> GetData()
{
return new DataSourceResult<AspNetUser>
{
Data = _context.AspNetUsers.AsAsyncEnumerable(),
PageIndex = 1,
PageSize = 10,
TotalCount = 12345
};
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.