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

Graph API v5(.NET SDK)添加skiptoken查询参数问题求助

解决Graph API v5 .NET SDK分页(skiptoken)问题

问题根源

你当前的实现存在两个核心问题:

  1. 手动修改UrlTemplate完全没必要,Graph SDK已内置支持OData查询参数(包括$select、$top、$skiptoken)的模板,手动插入会破坏原有URL结构,导致参数解析失败。
  2. QueryParameters的键名格式错误,不应使用?%24select这类编码后的带问号的键,SDK会自动处理参数编码与URL拼接,错误的键名会被识别为普通参数而非OData查询参数,引发400错误或分页失效。

正确实现方式

手动控制skiptoken的示例(用户列表)

直接使用SDK的链式调用或RequestConfiguration来添加查询参数,无需修改模板:

// 构建基础查询
var usersQuery = GraphServiceClient.Users
    .Select("mail,userPrincipalName,id,displayName,userType");

// 添加分页大小
if (pageSize.HasValue)
{
    usersQuery = usersQuery.Top(pageSize.Value);
}

// 添加skiptoken(如果有)
if (!string.IsNullOrWhiteSpace(token))
{
    usersQuery = usersQuery.WithQueryOptions(new QueryOption("$skiptoken", token));
}

// 执行请求
var response = await usersQuery.GetAsync();

或者使用RequestConfiguration的写法:

var requestConfig = new RequestConfiguration();
var queryOptions = new List<QueryOption>
{
    new QueryOption("$select", "mail,userPrincipalName,id,displayName,userType")
};

if (pageSize.HasValue)
{
    queryOptions.Add(new QueryOption("$top", pageSize.Value.ToString()));
}

if (!string.IsNullOrWhiteSpace(token))
{
    queryOptions.Add(new QueryOption("$skiptoken", token));
}

requestConfig.QueryParameters = queryOptions;

var requestInfo = GraphServiceClient.Users.ToGetRequestInformation(requestConfig);
var response = await GraphServiceClient.RequestAdapter.SendAsync(requestInfo, UserCollectionResponse.CreateFromDiscriminatorValue);

其他资源的通用写法

SharePoint站点、列表、团队频道、OneNote笔记本等资源的分页实现逻辑完全一致,只需替换对应的请求构建器:

// 示例:SharePoint站点分页
var sitesQuery = GraphServiceClient.Sites
    .Select("id,name,webUrl")
    .Top(pageSize.Value);

if (!string.IsNullOrWhiteSpace(token))
{
    sitesQuery = sitesQuery.WithQueryOptions(new QueryOption("$skiptoken", token));
}

var sitesResponse = await sitesQuery.GetAsync();

自动分页(推荐)

如果不需要手动控制skiptoken,可使用SDK内置的PageIterator自动处理分页逻辑:

var initialResponse = await GraphServiceClient.Users
    .Select("mail,userPrincipalName,id,displayName,userType")
    .Top(pageSize.Value)
    .GetAsync();

var pageIterator = PageIterator<User, UserCollectionResponse>.CreatePageIterator(
    GraphServiceClient,
    initialResponse,
    (user) =>
    {
        // 处理单个用户数据
        Console.WriteLine(user.DisplayName);
        return true; // 返回true继续迭代下一页
    }
);

// 自动遍历所有分页
await pageIterator.IterateAsync();

关键说明

  • SDK会自动处理OData参数的编码、URL拼接以及分页响应中@odata.nextLink的解析,无需手动修改模板或拼接参数。
  • 400错误通常是由于URL格式错误(如重复的?、参数编码异常)导致,使用SDK原生方法可避免这类问题。
  • 所有支持分页的Graph API资源,都可以通过上述方式添加skiptoken参数或使用自动分页。

内容的提问来源于stack exchange,提问作者user15854784

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 23:35:25