【问题标题】:Microsoft Graph API Pagination is not working for getting all users from Azure ADMicrosoft Graph API 分页无法从 Azure AD 获取所有用户
【发布时间】:2021-07-11 07:33:31
【问题描述】:

我们正在使用 Microsoft Graph API Beta 版使用以下代码从 Azure AD 检索所有用户。 API 在响应中仅返回 100 个用户,为了使用分页响应,我们尝试了 NextPageRequest 属性。但它总是为NextPageRequest 属性返回null。因此,它永远不会进入 while 循环来检索其余用户。

Beta SDK 版本:4.0.1.0

代码:

                List<User> usersList = new List<User>();
                IGraphServiceUsersCollectionPage users = await graphClient.Users.Request().GetAsync();

                // Add the first page of results to the user list
                usersList.AddRange(users.CurrentPage);

                // Fetch each page and add those results to the list
                while (users.NextPageRequest != null)
                {
                    users = await users.NextPageRequest.GetAsync();
                    usersList.AddRange(users.CurrentPage);
                }

                log.Info("Users count: " + usersList.Count.ToString());
                return usersList;

我关注的参考链接:

对此的任何帮助将不胜感激!

【问题讨论】:

    标签: c# microsoft-graph-api microsoft-graph-sdks beta


    【解决方案1】:

    下面的代码对我来说非常好。

    public static async Task<List<User>> getUsers()
            {
                List<User> usersList = new List<User>();
                graphClient.BaseUrl = "https://graph.microsoft.com/beta";
                IGraphServiceUsersCollectionPage users = await graphClient.Users
                    .Request()
                    .GetAsync();
    
                usersList.AddRange(users.CurrentPage);
    
                while (users.NextPageRequest != null)
                {
                    users = await users.NextPageRequest.GetAsync();
                    usersList.AddRange(users.CurrentPage);
                }
                return usersList;
            }
    

    在 Azure Active Directory 用户刀片中检查您的用户,并查看其中有多少用户。您还可以通过简单地使用 $top 查询参数扩展代码来测试用户数量是否超过 100,每个请求提供 998 条记录,如下所示。

    IGraphServiceUsersCollectionPage users = await graphClient.Users
                        .Request()
                        .Top(998)
                        .GetAsync();
    

    您还可以在Graph Explorer 中测试 Graph API 调用。

    编辑:

    经过长时间的研究,我发现它是 Microsoft Graph Beta SDK 中的一个错误,因为它总是在 NextPageRequest 中发送空值。但这里有趣的是,它在AdditionalData 属性中发送odata.nextLink。因此,如果您使用的是 Graph Beat SDK,请使用以下代码。

    public static async Task<List<User>> getUsers()
            {
                List<User> usersList = new List<User>();
                IGraphServiceUsersCollectionPage users = await graphClient.Users
                    .Request()
                    .GetAsync();
    
                usersList.AddRange(users.CurrentPage);
                try
                {
                    while (users.AdditionalData["@odata.nextLink"].ToString() != null)
                    {
                        users.InitializeNextPageRequest(graphClient, users.AdditionalData["@odata.nextLink"].ToString());
                        users = await users.NextPageRequest.GetAsync();
                        usersList.AddRange(users.CurrentPage);
                    }
                }
                catch(Exception e)
                {
                    
                }
                return usersList;
            }
    

    注意:Microsoft 不建议在生产环境中使用其Graph Beta version,因为它们可能会发生变化。

    【讨论】:

    • 谢谢湿婆。我在 Azure AD 中有 500 多个用户。我尝试了提供的相同代码,但它仍然为“NextPageRequest”属性提供了空值。另外,如果我尝试 top(500) 那么它将返回所有 500 个用户。
    • 你在图形浏览器中测试过吗?
    • 是的,我在图形资源管理器中进行了测试,它工作正常。
    • 您使用的是哪个版本的 beta SDK?
    • 在 NET 5 平台上使用 C# 使用 Microsoft.Graph.Beta 完美地使用第一种方法从 Azure 获取所有用户!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多