使用Microsoft Graph API获取组增量数据时,无法获取组成员的displayName和mail字段的问题
Microsoft Graph API获取组增量数据时,无法获取组成员的displayName和mail字段的问题
嗨,我之前也碰到过这个坑!这其实是Graph API组增量查询的特性导致的——当你用groups/delta端点尝试$expand=members时,members@delta字段只会返回成员的ID,不会带上你指定的displayName和mail。因为增量查询的核心是跟踪组成员的添加/移除变化,而不是返回成员的完整属性信息。
那该怎么拿到成员的详细属性呢?这里有两种实用的解决方案:
方案一:批量获取成员详细信息(推荐)
拿到增量响应里的成员ID后,用Graph API的批量请求($batch)一次性获取多个用户的displayName和mail,既能减少请求次数,也能提升效率。
修改后的代码示例
public async Task MeetingsDetails() { var clientSecretCredential = new ClientSecretCredential(TenantId, ClientId, ClientSecret); string[] scopes = new string[] { "https://graph.microsoft.com/.default" }; AccessToken tokenResult = await clientSecretCredential.GetTokenAsync(new TokenRequestContext(scopes)); var accessToken = tokenResult.Token; var client = new HttpClient(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); // 1. 获取组的增量数据 string deltaUrl = $"https://graph.microsoft.com/v1.0/groups/delta?$filter=id eq '{groupId}'"; var deltaResponse = await client.GetAsync(deltaUrl); if (deltaResponse.IsSuccessStatusCode) { var deltaJson = await deltaResponse.Content.ReadAsStringAsync(); var deltaData = JObject.Parse(deltaJson); // 提取members@delta里的成员ID列表 var memberIds = deltaData["value"]?[0]?["members@delta"]? .Select(j => j["id"]?.ToString()) .Where(id => !string.IsNullOrEmpty(id)) .ToList(); if (memberIds?.Any() == true) { // 2. 构造批量请求获取用户详细信息 var batchRequests = new JObject { ["requests"] = new JArray( memberIds.Select(id => new JObject { ["id"] = memberIds.IndexOf(id).ToString(), ["method"] = "GET", ["url"] = $"/users/{id}?$select=id,displayName,mail" }) ) }; var batchContent = new StringContent(batchRequests.ToString(), Encoding.UTF8, "application/json"); var batchResponse = await client.PostAsync("https://graph.microsoft.com/v1.0/$batch", batchContent); if (batchResponse.IsSuccessStatusCode) { var batchJson = await batchResponse.Content.ReadAsStringAsync(); Console.WriteLine("成员详细信息:"); Console.WriteLine(batchJson); } else { Console.WriteLine($"批量请求错误: {batchResponse.StatusCode}, {await batchResponse.Content.ReadAsStringAsync()}"); } } else { Console.WriteLine("该组没有成员变化或无成员"); } } else { Console.WriteLine($"增量请求错误: {deltaResponse.StatusCode}, {await deltaResponse.Content.ReadAsStringAsync()}"); } }
方案二:单独查询每个成员(适合小体量场景)
如果组的成员数量不多,也可以直接遍历成员ID,逐个调用/users/{id}?$select=id,displayName,mail来获取属性,代码更简单,但请求次数会多一些。
关键代码片段
// 提取成员ID后遍历查询 foreach (var id in memberIds) { var userUrl = $"https://graph.microsoft.com/v1.0/users/{id}?$select=id,displayName,mail"; var userResponse = await client.GetAsync(userUrl); if (userResponse.IsSuccessStatusCode) { var userJson = await userResponse.Content.ReadAsStringAsync(); Console.WriteLine(userJson); } }
注意事项
- 确保你的应用已被授予**
User.Read.All或Group.Read.All**的应用权限(需要读取用户个人信息),且权限已得到管理员同意。 - 批量请求一次最多支持20个请求,如果成员数量超过20,记得拆分多个批量请求。
内容来源于stack exchange
相关产品推荐
相关产品推荐

