使用Graph API SDK(C#)获取SharePoint嵌套文件夹遇invalidRequest错误的解决
问题原因分析
你的请求失败主要有三个核心问题:
- 站点标识符错误:
site.sharepoint.com不是Graph API认可的站点ID格式,需要使用站点的唯一ID(如{tenant}.sharepoint.com,{site-guid})或者站点的相对路径(如/sites/{site-name})。 - Drive概念混淆:
Drives["2022"]中的2022是文件夹名称,但Drive指的是SharePoint的文档库,不是普通文件夹。你的2022是站点根文档库下的子文件夹,不能通过Drives集合直接访问。 - 嵌套文件夹访问方式错误:
Children["October"]这种通过名称索引Children集合的方式不被支持,Children返回的是项目列表,无法直接通过名称定位。
正确的实现方式
方式一:通过路径直接定位(推荐)
利用ItemWithPath方法直接传入完整的文件夹路径,一步到位获取目标文件夹:
// 替换为你的站点相对路径或站点ID var siteIdentifier = "/sites/你的站点名称"; var targetFolder = await graphClient .Sites[siteIdentifier] .Drive .Root .ItemWithPath("2022/October/25") .Request() .GetAsync();
方式二:逐层获取文件夹(适合需要中间步骤的场景)
如果需要逐层验证或处理中间文件夹,可以通过筛选名称的方式逐层获取:
var siteIdentifier = "/sites/你的站点名称"; // 获取站点根文档库 var rootDrive = await graphClient.Sites[siteIdentifier].Drive.Request().GetAsync(); // 获取2022文件夹 var folder2022 = await graphClient .Sites[siteIdentifier] .Drive .Root .Children .Request() .Filter("name eq '2022' and folder ne null") .GetAsync() .ContinueWith(t => t.Result.FirstOrDefault()); // 获取October文件夹 var folderOctober = await graphClient .Sites[siteIdentifier] .Drive .Items[folder2022.Id] .Children .Request() .Filter("name eq 'October' and folder ne null") .GetAsync() .ContinueWith(t => t.Result.FirstOrDefault()); // 获取25文件夹 var folder25 = await graphClient .Sites[siteIdentifier] .Drive .Items[folderOctober.Id] .Children .Request() .Filter("name eq '25' and folder ne null") .GetAsync() .ContinueWith(t => t.Result.FirstOrDefault());
额外注意事项
- 确保你的应用拥有
Files.Read或Files.ReadWrite的权限(根据需求选择)。 - 如果使用站点ID,可以通过Graph Explorer先查询站点列表获取正确的ID值。
内容的提问来源于stack exchange,提问作者Azhari
相关产品推荐
相关产品推荐

