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

使用Microsoft Graph批量查询Entra用户时重复返回相同数据的问题求助

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 10:33:08