You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Microsoft Graph获取SharePoint「我的文件」文档遇空对象问题求解

解决Microsoft Graph获取用户「我的文件」文档的问题

代码中的核心问题

你的代码存在两个关键问题导致返回空对象:

  1. 未加载嵌套属性:调用graphClient.Users["XXXXXX@XXX.com"].GetAsync()时,Graph API默认只返回用户的基础属性(如ID、邮箱),不会自动加载关联的Drive及Items,必须显式指定要展开的嵌套属性。
  2. 错误的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 11:05:16