.net core web api - 如何以块的形式返回表结果

Posted

技术标签:

【中文标题】.net core web api - 如何以块的形式返回表结果【英文标题】:.net core web api - How to return table results in chunks 【发布时间】:2021-11-26 13:57:36 【问题描述】:

当最终用户加载表格时,我们会向他们返回数以万计的结果。我们希望返回所有数据,以便过滤和排序可以在客户端进行。根据用户的连接情况,初始加载可能会有点慢。

为了加快速度,我想以块的形式返回数据,一次几千行,并在准备好时添加它们。排序和过滤需要等到完成,但至少最终用户能够在等待时看到结果。有没有办法使用 async 以块的形式返回结果?理想情况下,它会首先返回一些摘要信息,例如总结果。

【问题讨论】:

async 没有流式传输。 HTTP 无论如何都不允许流式传输结果,这在 gRPC 中可用。您可以在 HTTP 中做的是 paging - 一次请求特定页面的数据。您可以自己实现分页(它只需要一个偏移量和计数参数),或者您可以创建一个 GraphQL 或 OData 服务,其中分页是协议本身的一部分。 借助 ASP.NET Core 6,您可以流式传输 JSON 响应而无需缓冲 (IAsyncEnumerable)。客户端代码需要进行调整才能处理此类响应 @PanagiotisKanavos 是的,我知道!分页不是满足我们业务需求的合适解决方案 - 它会删除一些交互性和预测过滤。 @AlekseyL。谢谢,我也会调查的。 tpeczek.com/2021/07/aspnet-core-6-and-iasyncenumerable.html 看起来很有趣。 @trees_are_great 为什么会这样?如果您使用无限滚动,用户甚至不会注意到差异。您接受的答案并没有解决这个问题。它解决了双重缓冲并在返回之前等待所有结果的问题。如果客户端是 API,那就绰绰有余了。但是,如果客户端是浏览器,则 17K 行表将导致显着延迟。即使你使用像 ag-Grid 这样的网格,它仍然会占用空间作为 JS 数组。如果您使用 ag-Grid,虚拟化/无限滚动已经可用。和过滤 【参考方案1】:

您可以使用 yield return 来返回数据块,如下所示。

 public class ValuesController : ApiController
        
            [HttpGet]
            public IEnumerable<ReturnModel> Get()
            
                // An example of returning large number of objects
                foreach (var i in Enumerable.Range(0, 10000))
                    yield return new ReturnModel()  SequenceNumber = i, ID = Guid.NewGuid() ;
            
        

将此Link 用作参考!

【讨论】:

以上是关于.net core web api - 如何以块的形式返回表结果的主要内容,如果未能解决你的问题,请参考以下文章