Azure Cosmos DB中Continuation Token返回Null的问题求助
问题原因及修复方案
核心问题
你代码里的续传令牌赋值完全错误!在QueryFetchNextPage方法中,你把传入的旧continuationToken赋值给了VolcanoResult.ContinuationToken,但实际上续传令牌应该从读取到的page对象里获取新的令牌(即page.ContinuationToken)。
因为调用iterator.ReadNextAsync()获取一页数据后,下一页的续传令牌是存在返回的page对象中的,不是你传入的旧参数。你当前的写法会导致第一次循环就返回null(初始传入的是default(string)也就是null),直接跳出循环,根本没去拉取后续的1575条数据。
修复后的关键代码
修改QueryFetchNextPage方法里的令牌赋值逻辑:
VolcanoResult VolcanoResult = new VolcanoResult(); VolcanoResult.Status = 200; VolcanoResult.RecordCount = itemCount; // 替换成从page中获取新的续传令牌 VolcanoResult.ContinuationToken = page.ContinuationToken; VolcanoResult.Volcanoes = volcanoes;
额外修复:合并所有分页数据
你的GetVolcanoes方法当前只返回最后一页的结果,前面的分页数据都会被覆盖。如果需要返回所有1576条火山数据,需要合并每一页的结果:
public async Task<VolcanoResult> GetVolcanoes() { var finalResult = new VolcanoResult { Status = 200, Volcanoes = new List<Volcano>(), RecordCount = 0 }; var continuationToken = default(string); do { var pageResult = await QueryFetchNextPage(continuationToken); // 合并当前页数据到最终结果 finalResult.Volcanoes.AddRange(pageResult.Volcanoes); finalResult.RecordCount += pageResult.RecordCount; continuationToken = pageResult.ContinuationToken; } while (continuationToken != null); return finalResult; }
其他优化建议
- 代码中
container.ReadThroughputAsync()没有实际用途,可以删除,减少不必要的数据库请求。 - 当
MaxItemCount设为1时,每调用一次ReadNextAsync()会返回1条数据,直到最后一页时page.ContinuationToken才会变为null。
内容的提问来源于stack exchange,提问作者Sumchans
相关产品推荐
相关产品推荐

