使用 Microsoft Graph SDK 对集合进行分页

出于性能原因,实体集合通常拆分为页面,每个页面都返回下一页的 URL。 PageIterator 类简化了分页集合的使用。 PageIterator 处理枚举当前页面并自动请求后续页面。

请求标头

如果在初始请求中发送任何其他请求标头,则默认情况下,这些标头不会包含在后续页面请求中。 如果需要在后续请求中发送这些标头,则必须显式设置它们。

循环访问所有消息

以下示例演示如何迭代用户邮箱中的所有邮件。

提示

本示例使用 top 参数设置较小的页面大小以进行演示。 可以将页面大小设置为 999,以最大程度地减少所需的请求数。

var messages = await graphClient.Me.Messages
    .Request()
    .Header("Prefer", "outlook.body-content-type=\"text\"")
    .Select(e => new {
        e.Sender,
        e.Subject,
        e.Body
    })
    .Top(10)
    .GetAsync();

var pageIterator = PageIterator<Message>
    .CreatePageIterator(
        graphClient,
        messages,
        // Callback executed for each item in
        // the collection
        (m) =>
        {
            Console.WriteLine(m.Subject);
            return true;
        },
        // Used to configure subsequent page
        // requests
        (req) =>
        {
            // Re-add the header to subsequent requests
            req.Header("Prefer", "outlook.body-content-type=\"text\"");
            return req;
        }
    );

await pageIterator.IterateAsync();

停止和恢复迭代

某些方案需要停止迭代过程才能执行其他操作。 可以通过从迭代回调返回 false 来暂停迭代。 可以通过在 PageIterator 上调用resume方法来恢复迭代。

int count = 0;
int pauseAfter = 25;

var messages = await graphClient.Me.Messages
    .Request()
    .Select(e => new {
        e.Sender,
        e.Subject
    })
    .Top(10)
    .GetAsync();

var pageIterator = PageIterator<Message>
    .CreatePageIterator(
        graphClient,
        messages,
        (m) =>
        {
            Console.WriteLine(m.Subject);
            count++;
            // If we've iterated over the limit,
            // stop the iteration by returning false
            return count < pauseAfter;
        }
    );

await pageIterator.IterateAsync();

while (pageIterator.State != PagingState.Complete)
{
    Console.WriteLine("Iteration paused for 5 seconds...");
    await Task.Delay(5000);
    // Reset count
    count = 0;
    await pageIterator.ResumeAsync();
}