.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?