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

调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:18:19