首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.NET,它提供流而不是大JSONArray

ASP.NET,它提供流而不是大JSONArray
EN

Stack Overflow用户
提问于 2022-02-07 19:42:17
回答 1查看 1.3K关注 0票数 1

我有一个相当大的对象列表,这些对象需要从客户端快速接收。目前它大约需要2-4秒。现在我尝试使用流发送块(例如,每个对象100个),我知道GRPC可以使用流,但在ASP.NET内核中,如何实现这一点?普通的ASP.NET具有核心中不可用的PushStreamContent。有什么解决办法吗?我在网上找不到合适的。

那么,我的控制器当前的样子是:

代码语言:javascript
复制
 [HttpGet]
 public async Task<ActionResult<IEnumerable<Price>>> GetPrices()
 {
     return await _context.Prices.ToListAsync();
 }

此列表目前包含约18700项,但此数字将随着时间的推移而增加。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-08 18:08:36

我猜你是根据你的例子使用EF Core的。

如果您看一下高效的查询缓冲和流,他们建议使用AsEnumerable来流数据,而不是ToList,后者在将数据返回给客户端之前(在您的情况下)将所有数据加载到内存中。异步版本是AsAsyncEnumerable

因此,您应该能够简单地将控制器操作更改为:

代码语言:javascript
复制
[HttpGet]
public async Task<ActionResult<IEnumerable<Price>>> GetPrices()
{
    return await _context.Prices.AsAsyncEnumerable();
}

请注意,流而不是缓冲/加载到内存并不意味着在所有情况下性能都会提高,但是有了大型数据集,很有可能看到更好的性能。

发送这么大的JSON数据是一种代码气味/糟糕的做法吗?

不一定。如果您实际上需要拥有整个dataset客户端,那么这可能是最有效的方法。但是,如果您的数据集很大,您应该期望下载它需要一些时间。如果您的下载速度为5MB/s,而Price数据为10 MB,那么如果没有更好的连接,您的下载速度将永远不会超过2秒。即使您使用来自后端的流。

另一种方法(如果适合您的需要)是引入分页。这样你就可以一次检索50个条目,而不是所有的东西,然后分页浏览。但是从客户端使用分页是否合理取决于您。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71024451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档