调用Microsoft Graph获取用户仅返回100条 如何获取全部用户
问题原因
Microsoft Graph 所有返回列表结果的接口默认启用分页机制,未指定页大小时单页默认返回100条数据,单次请求仅会返回第一页结果。你当前的代码只获取了第一页响应,自然最多只能拿到100条用户。
解决方法
获取全量用户需要遍历所有分页结果,以下是两种可直接使用的实现方案:
方案1:手动循环请求分页
每次拿到响应后判断是否存在下一页请求标识,存在则继续请求下一页,直到所有分页遍历完成,合并所有页的结果即可。
var allUsers = new List<User>(); // 发起第一页请求,可按需配置查询条件 var currentPage = await graphServiceClient .Users .Request() // 如需减少请求次数,可开启高级查询头将单页上限提升至999 // .Header("ConsistencyLevel", "eventual") // .Top(999) .Select(u => new {u.Id, u.DisplayName, u.Mail}) // 按需选择返回字段,提升请求效率 .GetAsync(); allUsers.AddRange(currentPage.CurrentPage); // 循环拉取所有后续分页 while (currentPage.NextPageRequest != null) { currentPage = await currentPage.NextPageRequest.GetAsync(); allUsers.AddRange(currentPage.CurrentPage); }
如果必须使用同步逻辑,可将代码中的await替换为.GetAwaiter().GetResult(),但不推荐在Web应用、UI线程等存在同步上下文的场景使用,容易引发死锁问题。
方案2:使用SDK内置分页迭代器(推荐)
Graph SDK 官方提供了封装好的分页迭代工具,不需要手动编写循环判断逻辑,代码更简洁不易出错:
var allUsers = new List<User>(); // 获取第一页数据 var firstPage = await graphServiceClient .Users .Request() // .Header("ConsistencyLevel", "eventual") // .Top(999) .GetAsync(); // 初始化分页迭代器 var pageIterator = PageIterator<User> .CreatePageIterator( graphServiceClient, firstPage, // 遍历到单条用户数据时的回调逻辑 (user) => { allUsers.Add(user); return true; // 返回true继续遍历,返回false可提前终止遍历 } ); // 启动遍历,自动处理所有分页拉取 await pageIterator.IterateAsync();
注意事项
- 单页请求大小上限最高为999,设置超过该值会直接触发接口错误。
- 如果租户下用户量极大(数千以上),不建议一次性将所有用户数据加载到内存中,可以在迭代回调中做分批处理,降低内存占用。
- 涉及筛选、排序的高级查询场景,必须添加
ConsistencyLevel: eventual请求头才能正常生效。
内容的提问来源于stack exchange,提问作者MJ X
相关产品推荐
相关产品推荐

