使用Microsoft Graph API v5(.NET SDK)无法获取SharePoint站点所有列表
问题1:仅返回50个列表的解决方案
Graph API默认分页大小为50条,即便nextLink返回null,也可能是API返回逻辑导致未触发下一页标记,但实际仍有未返回的数据。要获取全部列表,需手动处理分页逻辑,或设置更大的$top参数(API单页上限通常为1000)。
方案1:使用SDK的PageIterator自动处理分页
这是Kiota(Graph v5 SDK基于Kiota)推荐的分页遍历方式,可自动处理所有分页结果:
var graphClient = GetGraphClient(); var allLists = new List<List>(); var initialRequest = graphClient.Sites[siteId].Lists.GetAsync((config) => { config.QueryParameters.Expand = new string[] { "drive" }; config.QueryParameters.Select = new string[] { "system", "*" }; config.QueryParameters.Top = 1000; // 设置单页最大返回数 }); var pageIterator = PageIterator<List, ListCollectionResponse>.CreatePageIterator( graphClient.RequestAdapter, await initialRequest, (list) => { allLists.Add(list); return true; // 继续遍历下一项 }, (response) => { // 生成下一页请求(如果存在) if (!string.IsNullOrEmpty(response.OdataNextLink)) { return graphClient.Sites[siteId].Lists.WithUrl(response.OdataNextLink).GetAsync(); } return Task.FromResult<ListCollectionResponse>(null); } ); await pageIterator.IterateAsync(); // allLists 现在包含站点所有列表
方案2:手动循环处理nextLink
若不想使用PageIterator,可手动检查并请求下一页:
var graphClient = GetGraphClient(); var allLists = new List<List>(); ListCollectionResponse currentResult = null; do { currentResult = currentResult == null ? await graphClient.Sites[siteId].Lists.GetAsync((config) => { config.QueryParameters.Expand = new string[] { "drive" }; config.QueryParameters.Select = new string[] { "system", "*" }; config.QueryParameters.Top = 1000; }) : await graphClient.Sites[siteId].Lists.WithUrl(currentResult.OdataNextLink).GetAsync(); if (currentResult.Value != null) { allLists.AddRange(currentResult.Value); } } while (!string.IsNullOrEmpty(currentResult?.OdataNextLink)); // allLists 包含全部列表
问题2:启用注释行导致400错误的原因
你注释的代码手动修改了UrlTemplate,这是错误操作:
//requestInformation.UrlTemplate = requestInfo.UrlTemplate.Insert(requestInfo.UrlTemplate.Length - 1, ",%24select,%24expand");
Kiota生成的UrlTemplate遵循固定格式(包含{siteId}等占位符),手动插入%24select,%24expand会破坏URL结构,导致服务器返回400(请求格式错误)。正确方式是通过QueryParameters.Add添加参数,同时你的代码存在语法错误,修正后应为:
requestInformation.QueryParameters.Add("%24select", "system,*"); requestInformation.QueryParameters.Add("%24expand", "drive");
内容的提问来源于stack exchange,提问作者user15854784
相关产品推荐
相关产品推荐

