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

使用Microsoft GraphClient查询OneDrive增量数据抛出ItemNotFound异常

问题根因与解决方案

1. 访问目标与权限配置错误

  • 确认你获取访问令牌时申请的权限符合要求:委托权限场景需要申请Files.Read或Files.ReadWrite权限,应用权限场景需要申请Files.Read.All或Files.ReadWrite.All权限,应用权限必须由全局管理员完成授权同意。
  • 如果你访问的不是当前登录用户的OneDrive,不能使用graphClient.Drive.Root调用,需要替换为指定目标的访问路径:
    • 访问指定用户的OneDrive:graphClient.Users["目标用户ID/用户UPN"].Drive.Root
    • 访问指定SharePoint站点的文档库:graphClient.Sites["目标站点ID"].Drive.Root
  • 确认目标账号已完成OneDrive初始化:首次使用的新账号需要手动登录OneDrive网页端完成初始化,否则访问根目录会直接返回itemNotFound错误。

2. DeltaLink复用逻辑错误

你当前的代码仅支持单次运行上下文内的分页查询,如果你是将deltaLink持久化存储、跨请求/跨应用重启复用,不能依赖内存中的lastDrivePage对象,否则会出现请求构造错误。可参考以下修复后的代码:

private async Task<IDriveItemDeltaCollectionPage> GetFiles(GraphServiceClient graphClient, string deltaLink = null)
{
    IDriveItemDeltaCollectionPage page;

    if (string.IsNullOrEmpty(deltaLink))
    {
        // 首次请求无deltaLink,发起全量同步
        page = await graphClient.Drive.Root
                    .Delta()
                    .Request()
                    .GetAsync();
    }
    else
    {
        // 直接用持久化的deltaLink构造请求,无需依赖内存中的历史页面对象
        page = new DriveItemDeltaCollectionPage();
        page.InitializeNextPageRequest(graphClient, deltaLink);
        page = await page.NextPageRequest.GetAsync();
    }

    // 每次请求后需将最新的deltaLink持久化存储:page.AdditionalData["@odata.deltaLink"]?.ToString()
    return page;
}

如果确认逻辑正确仍报错,大概率是你存储的deltaLink已过期,直接丢弃旧的deltaLink,重新发起一次全量delta请求获取新的令牌即可。

3. 访问令牌校验

可以自行解析你获取到的访问令牌,检查权限声明scp(委托权限)或roles(应用权限)中是否包含你申请的OneDrive相关权限,同时确认受众声明aud为https://graph.microsoft.com。

内容的提问来源于stack exchange,提问作者vivek bajpai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:45:05