繁体   English   中英

ASP.NET Core 6 - 异步流以及额外的元数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM