.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 - 如何以块的形式返回表结果的主要内容,如果未能解决你的问题,请参考以下文章

如何以块的形式写入文件以规避大文件大小的错误?

如何将 .net core Web API 项目添加到现有的 .NET core (3.1) Web Application 项目中?

如何将 .NET Core 2.2 Web API 迁移到 .NET Core 3.0?

如何使用 Angular 取消 .Net Core Web API 请求?

如何在 .NET Core Web API 中配置并发?

.NET Core Web APi类库如何内嵌运行?