如何用.NET SDK获取超5000项OneDrive中OneNote笔记本分区?
解决OneNote分区分页获取问题(针对5000+文件的10008错误)
当遇到OneDrive API的查询限制(错误码10008)时,核心就是通过分页查询来分批获取数据,不管是用Microsoft Graph .NET SDK还是直接调用REST API都能实现,下面分别给出具体实现方式:
一、使用Microsoft Graph .NET SDK实现分页
Graph SDK本身已经内置了分页处理的能力,你之前的代码只调用了GetAsync()只能拿到第一页,改成下面的循环逻辑就能搞定:
var allSections = new List<OnenoteSection>(); var sectionsPage = await graphClient.Users[userId].Onenote.Notebooks[notebookId].Sections.Request().GetAsync(); // 先添加第一页数据 allSections.AddRange(sectionsPage.CurrentPage); // 循环获取后续分页数据 while (sectionsPage.NextPageRequest != null) { sectionsPage = await sectionsPage.NextPageRequest.GetAsync(); allSections.AddRange(sectionsPage.CurrentPage); } // allSections集合里就是该笔记本下的所有分区了
这个逻辑会自动处理分页:每次拿到当前页后,检查是否存在NextPageRequest,如果有就继续请求下一页,直到没有更多数据为止,完全避开5000条的限制阈值。
二、改用REST API实现分页
如果更倾向于直接调用REST API,分页的核心是利用$top参数控制每页数量,以及响应中的@odata.nextLink来获取下一页的请求地址:
第一页请求:
发送GET请求到以下地址(替换{userId}和{notebookId}):https://graph.microsoft.com/v1.0/users/{userId}/onenote/notebooks/{notebookId}/sections?$top=1000这里
$top=1000表示每页最多拿1000条数据(你可以根据需求调整,比如500或2000,只要不超过5000的限制就行)。后续分页请求:
查看响应的JSON内容,如果包含@odata.nextLink字段,就用这个字段的值作为下一页的请求地址,重复发送GET请求,直到响应中不再出现@odata.nextLink,说明所有数据都获取完毕。
举个简化版的响应示例:
{ "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users/{userId}/onenote/notebooks/{notebookId}/sections", "@odata.nextLink": "https://graph.microsoft.com/v1.0/users/{userId}/onenote/notebooks/{notebookId}/sections?$top=1000&$skiptoken=abc123...", "value": [ // 分区数据列表 ] }
你只需要循环调用@odata.nextLink对应的地址即可完成全量数据获取。
不管用哪种方式,分页都能完美解决5000条数据的限制问题,根据你的项目需求选择合适的实现方式就好。
内容的提问来源于stack exchange,提问作者Thomas Harris
相关产品推荐
相关产品推荐

