使用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初始化:首次使用的新账号需要手动登录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
相关产品推荐
相关产品推荐

