使用Microsoft Graph批量查询Entra用户时重复返回相同数据的问题求助
各位好,我最近在开发一个功能,需要通过Microsoft Graph批量查询Entra用户来提升请求效率,但遇到了一个奇怪的问题——批量请求返回的总是重复的19条用户数据,想请教下大家哪里出错了。
先跟大家说下单个请求的正常情况:
我用这样的过滤条件单独调用Graph API是完全正常的,能正确返回对应用户:(startswith(userprincipalname,'xyz105766')) OR (startswith(userprincipalname,'xyz111380')) OR (startswith(userprincipalname,'xyz123220')) OR (startswith(userprincipalname,'xyz160852')) OR (startswith(userprincipalname,'xyz197308')) OR (startswith(userprincipalname,'xyz265002')) OR (startswith(userprincipalname,'xyz283506')) OR (startswith(userprincipalname,'xyz309288')) OR (startswith(userprincipalname,'xyz312202')) OR (startswith(userprincipalname,'xyz337328'))
现在我的需求是处理一个List<string>类型的过滤条件列表,上面这个长过滤串其实是列表里的其中一个元素。我尝试自己实现批量请求的逻辑,但结果不对,总是拿到重复数据。
以下是我写的代码:
批量请求核心逻辑
var membersList = new List<EntraUser>(); // 自定义的用户实体类 var filters = CreateQueryFilter(list); var batchRequest = new BatchRequestContentCollection(graphClient); var batchIds = new List<string>(); int cnt = 0; foreach (string filter in filters) { var requestInfo = graphClient.Users .ToGetRequestInformation(config => { GetGraphOptions(filter, null); }); batchRequest = new BatchRequestContentCollection(graphClient); var requestId = await batchRequest.AddBatchRequestStepAsync(requestInfo); batchIds.Add(requestId); cnt++; } var response = await graphClient.Batch.PostAsync(batchRequest); // 处理每个批量请求的响应 foreach (var id in batchIds) { var callResult = await response.GetResponseByIdAsync<UserCollectionResponse>(id); if (callResult != null && callResult.Value != null) { // 我发现这里的callResult.Value似乎总是返回100条重复的数据? callResult.Value.ToList().ForEach(s => { var member = new EntraUser(s); membersList.Add(member); }); } } batchIds.Clear();
构建Graph请求配置的方法
private static Action<RequestConfiguration<UsersRequestBuilder.UsersRequestBuilderGetQueryParameters>> GetGraphOptions(string filter, string search) { return (requestConfiguration) => { requestConfiguration.QueryParameters.Count = true; // 因为不是所有用户都有扩展属性,必须配合ConsistencyLevel使用 requestConfiguration.Headers.Add("ConsistencyLevel", "eventual"); // 不加这个会报"Property 'extensionAttribute ?' does not exist"的错误 requestConfiguration.QueryParameters.Select = [.. GetEntraProperties()]; requestConfiguration.QueryParameters.Orderby = ["displayName asc"]; if (filter != null) { requestConfiguration.QueryParameters.Filter = filter; } if (search != null) { requestConfiguration.QueryParameters.Search = search; } }; }
生成过滤条件列表的方法
public List<string> CreateQueryFilter(List<string> filter) { List<string> result = new List<string>(); if (filter is null || filter.Count == 0) return result; int iter = 10; for (int i = 0; i < filter.Count; i += iter) { var limitedList = filter.Skip(i).Take(iter); result.Add(SearchToString( EntraSearchText.JoinCondition.OR, [new(limitedList, [EntraSearchText.FilterUpnString], EntraSearchText.JoinCondition.OR)] )); } return result; }
我自己排查了下,怀疑是不是批量请求的构建逻辑有问题?比如在foreach循环里每次都重新实例化BatchRequestContentCollection,导致最后实际发送的只有最后一个请求?但我又不确定,想请大家帮忙看看代码里的问题,或者有没有更正确的批量请求写法?
内容来源于stack exchange

