Graph API获取SharePoint团队站点驱动器返回0,无法上传文件
上下文
- Entra ID用户
myuser可通过浏览器正常访问SharePoint团队站点mysite的列表、文件夹及文件; - ASP.NET Core Web应用已配置Azure应用注册,用户
myuser可通过Entra ID SSO登录,应用能成功获取Graph API访问令牌,且可正常获取mysite的站点数据(含站点ID)。
问题
- 调用
_graphClient.Sites[$"{siteUrl}:{sitePath}"].GetAsync()获取站点数据时,返回的site.Drives字段为null; - 调用
_graphClient.Sites[site!.Id].Drives.GetAsync()直接获取站点驱动器时,返回HTTP 200但驱动器数量为0。
最终目标是上传文件到该站点文件夹,但因无法获取驱动器ID受阻。
相关代码:
var siteUrl = "<...>.sharepoint.com"; var sitePath = "/sites/<...>"; // 获取站点ID,成功但site.Drives为null var site = await _graphClient.Sites[$"{siteUrl}:{sitePath}"].GetAsync(); var siteId = site!.Id; // 可获取站点ID // 返回HTTP 200,但驱动器数量为0 var drives = await _graphClient.Sites[site!.Id].Drives.GetAsync();
附加信息
Web应用通过依赖注入获取_graphClient,Program.cs配置如下:
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd")) .EnableTokenAcquisitionToCallDownstreamApi() .AddMicrosoftGraph(builder.Configuration.GetSection("GraphV1"))
排查与解决步骤
1. 检查Graph API权限配置
确保应用注册已添加Delegated权限并完成管理员同意:
- 需添加
Sites.Read.All或Sites.ReadWrite.All权限(根据写入需求选择); - 确认权限状态为已授予管理员同意(在Azure门户的应用注册->API权限页面查看)。
2. 显式扩展请求字段
默认情况下,Graph API获取站点数据时不会返回drives字段,需要通过$expand参数显式请求:
var site = await _graphClient.Sites[$"{siteUrl}:{sitePath}"] .GetAsync(requestConfiguration => { requestConfiguration.QueryParameters.Expand = new string[] { "drives" }; });
修改后返回的site.Drives会包含站点的驱动器数据。
3. 直接定位默认文档库驱动器
团队站点的默认文档库可通过简化路径直接获取,无需先查询站点ID:
// 获取站点默认文档库驱动器 var drive = await _graphClient.Sites[$"{siteUrl}:{sitePath}"].Drives["root"].GetAsync(); // 或者直接获取站点所有驱动器 var drives = await _graphClient.Sites[$"{siteUrl}:{sitePath}"].Drives.GetAsync();
4. 验证访问令牌的权限范围
解码访问令牌(如使用jwt.ms工具),查看scp字段确认包含所需权限(如Sites.ReadWrite.All)。若权限缺失,检查appsettings.json中GraphV1配置节的权限范围:
"GraphV1": { "BaseUrl": "https://graph.microsoft.com/v1.0", "Scopes": "Sites.ReadWrite.All" }
5. 确认站点驱动器存在
通过浏览器访问站点的文档库页面,确认目标驱动器(文档库)确实存在,排除站点配置异常导致的驱动器缺失问题。
内容的提问来源于stack exchange,提问作者g.pickardou
相关产品推荐
相关产品推荐

