Microsoft Graph分页查询用户NextPageRequest报Invalid filter clause问题排查
问题原因
首次请求正常、分页报错的根源
你使用的Microsoft.Graph 4.1.0 + Microsoft.Graph.Core 2.0.1属于较早的SDK版本,存在已知的分页参数丢失问题:
- 首次请求时你通过
.Filter(filter)、.Select(GraphProperties)手动指定了查询参数,发往Graph API的请求URL中filter子句是正确编码的,所以执行正常 - 生成
NextPageRequest时,SDK没有正确把之前自定义的Filter、Select等查询参数附加到下一页的请求中,或是对filter参数的二次编码错误,导致最终发往API的请求中filter子句格式损坏/缺失,就抛出Invalid filter clause异常
正确实现方式
推荐用SDK内置的PageIterator处理分页,它会自动保留所有原始查询参数,无需手动处理下一页请求,写法更稳定:
public async Task<IList<GraphUser>> FindByUserType(string userType) { IList<GraphUser> ret = new List<GraphUser>(); if (Authenticate(out AuthToken token)) { GraphServiceClient client = GetGraphServiceClient(token); string filter = $"UserType eq '{userType}'"; // 首次请求和原有写法一致 IGraphServiceUsersCollectionPage users = await client.Users.Request() .Select(GraphProperties) .Filter(filter) .GetAsync(); // 使用PageIterator迭代所有分页 var pageIterator = PageIterator<User, IGraphServiceUsersCollectionPage>.CreatePageIterator( client, users, user => { GraphUser graphUser = new GraphUser(); MapGraphUser(graphUser, user); ret.Add(graphUser); return true; // 返回true表示继续迭代下一个元素 }); await pageIterator.IterateAsync(); } return ret; }
备选手动分页写法
如果不想用PageIterator,需要手动给下一页请求补全原始查询参数:
public async Task<IList<GraphUser>> FindByUserType(string userType) { IList<GraphUser> ret = new List<GraphUser>(); if (Authenticate(out AuthToken token)) { GraphServiceClient client = GetGraphServiceClient(token); string filter = $"UserType eq '{userType}'"; // 提前定义原始查询选项 var filterOption = new QueryOption("$filter", filter); var selectOption = new QueryOption("$select", GraphProperties); IGraphServiceUsersCollectionPage users = await client.Users.Request() .Select(GraphProperties) .Filter(filter) .GetAsync(); do { foreach (User user in users) { GraphUser graphUser = new GraphUser(); MapGraphUser(graphUser, user); ret.Add(graphUser); } if (users.NextPageRequest != null) { // 手动给下一页请求追加查询参数 users.NextPageRequest.QueryOptions.Add(filterOption); users.NextPageRequest.QueryOptions.Add(selectOption); users = await users.NextPageRequest.GetAsync(); } else { break; } } while (users.Count > 0); } return ret; }
如果条件允许建议升级Microsoft.Graph和Microsoft.Graph.Core到最新稳定版,该分页参数丢失的问题在后续版本已经修复。
内容的提问来源于stack exchange,提问作者mr.coffee
相关产品推荐
相关产品推荐

