使用 Microsoft SDK 分页Graph集合

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

请求标头

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

在所有邮件上进行 Iterate

下面的示例展示了如何对用户邮箱中所有邮件进行访问。

提示

此示例使用 参数设置一个小页面 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 暂停迭代。 可以通过在 resume PageIterator 上调用 方法来恢复迭代。

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...");
    Thread.Sleep(5000);
    // Reset count
    count = 0;
    await pageIterator.ResumeAsync();
}