使用Microsoft Graph获取SharePoint「我的文件」文档遇空对象问题求解
解决Microsoft Graph获取用户「我的文件」文档的问题
代码中的核心问题
你的代码存在两个关键问题导致返回空对象:
- 未加载嵌套属性:调用
graphClient.Users["XXXXXX@XXX.com"].GetAsync()时,Graph API默认只返回用户的基础属性(如ID、邮箱),不会自动加载关联的Drive及Items,必须显式指定要展开的嵌套属性。 - 错误的API端点调用:你要获取的「我的文件」是用户的OneDrive存储,而非SharePoint站点内容,调用
graphClient.Sites属于无效操作。
修正后的代码实现
以下是基于.NET 8的正确代码,用于获取指定用户「我的文件」根目录下的所有文档:
public async Task GetUserOneDriveFilesAsync(string tenantId, string clientId, string clientSecret, string userId) { string[] scopes = { "https://graph.microsoft.com/.default" }; var clientSecretCredential = new ClientSecretCredential(tenantId, clientId, clientSecret); var graphClient = new GraphServiceClient(clientSecretCredential, scopes); try { // 直接获取用户OneDrive根目录下的所有子项(即「我的文件」内容) var driveItems = await graphClient.Users[userId].Drive.Root.Children.GetAsync(requestConfiguration => { // 指定要返回的属性,避免默认只返回部分字段 requestConfiguration.QueryParameters.Select = new[] { "id", "name", "file", "folder" }; }); if (driveItems?.Value != null && driveItems.Value.Any()) { foreach (var item in driveItems.Value) { Console.WriteLine($"名称: {item.Name} | 类型: {(item.File != null ? "文件" : "文件夹")}"); } } else { Console.WriteLine("「我的文件」中没有内容或未获取到数据"); } } catch (Exception ex) { Console.WriteLine($"请求失败: {ex.Message}"); } }
关键注意事项
- 权限验证:确保你的应用已在Azure AD中授予应用级权限
Files.Read.All(需管理员同意),这是Client Credential流访问用户OneDrive的必要权限。 - 用户ID格式:
userId可以是用户的邮箱地址(如XXXXXX@XXX.com)或Azure AD中的用户对象ID。 - 分页处理:如果「我的文件」中内容较多,Graph API会返回分页结果,需要通过
driveItems.OdataNextLink进行后续页的请求。
内容的提问来源于stack exchange,提问作者Pooja Parmar
相关产品推荐
相关产品推荐

