我有一个相当大的对象列表,这些对象需要从客户端快速接收。目前它大约需要2-4秒。现在我尝试使用流发送块(例如,每个对象100个),我知道GRPC可以使用流,但在ASP.NET内核中,如何实现这一点?普通的ASP.NET具有核心中不可用的PushStreamContent。有什么解决办法吗?我在网上找不到合适的。
那么,我的控制器当前的样子是:
[HttpGet]
public async Task<ActionResult<IEnumerable<Price>>> GetPrices()
{
return await _context.Prices.ToListAsync();
}此列表目前包含约18700项,但此数字将随着时间的推移而增加。
发布于 2022-02-08 18:08:36
我猜你是根据你的例子使用EF Core的。
如果您看一下高效的查询缓冲和流,他们建议使用AsEnumerable来流数据,而不是ToList,后者在将数据返回给客户端之前(在您的情况下)将所有数据加载到内存中。异步版本是AsAsyncEnumerable。
因此,您应该能够简单地将控制器操作更改为:
[HttpGet]
public async Task<ActionResult<IEnumerable<Price>>> GetPrices()
{
return await _context.Prices.AsAsyncEnumerable();
}请注意,流而不是缓冲/加载到内存并不意味着在所有情况下性能都会提高,但是有了大型数据集,很有可能看到更好的性能。
发送这么大的JSON数据是一种代码气味/糟糕的做法吗?
不一定。如果您实际上需要拥有整个dataset客户端,那么这可能是最有效的方法。但是,如果您的数据集很大,您应该期望下载它需要一些时间。如果您的下载速度为5MB/s,而Price数据为10 MB,那么如果没有更好的连接,您的下载速度将永远不会超过2秒。即使您使用来自后端的流。
另一种方法(如果适合您的需要)是引入分页。这样你就可以一次检索50个条目,而不是所有的东西,然后分页浏览。但是从客户端使用分页是否合理取决于您。
https://stackoverflow.com/questions/71024451
复制相似问题