Página a través de una colección mediante los SDK de Microsoft Graph

Por motivos de rendimiento, las colecciones de entidades a menudo se dividen en páginas y cada página se devuelve con una dirección URL a la página siguiente. La clase PageIterator simplifica el consumo de colecciones paginadas. PageIterator controla la enumeración de la página actual y la solicitud de páginas posteriores automáticamente.

Encabezados de solicitud

Si envía encabezados de solicitud adicionales en la solicitud inicial, esos encabezados no se incluyen de forma predeterminada en las solicitudes de página posteriores. Si es necesario enviar esos encabezados en solicitudes posteriores, debe establecerlos explícitamente.

Iteración en todos los mensajes

En el ejemplo siguiente se muestra la iteración de todos los mensajes del buzón de un usuario.

Sugerencia

En este ejemplo se establece un tamaño de página pequeño mediante el top parámetro para fines de demostración. Puede establecer el tamaño de página en 999 para minimizar el número de solicitudes necesarias.

var messages = await graphClient.Me.Messages
    .GetAsync(requestConfiguration => 
    {
        requestConfiguration.QueryParameters.Top = 10;
        requestConfiguration.QueryParameters.Select = new string[] { "sender", "subject", "body" };
        requestConfiguration.Headers.Add("Prefer", "outlook.body-content-type=\"text\"");
    });

var pageIterator = PageIterator<Message,MessageCollectionResponse>
    .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.Headers.Add("Prefer", "outlook.body-content-type=\"text\"");
            return req;
        }
    );

await pageIterator.IterateAsync();

Detener y reanudar la iteración

Algunos escenarios requieren detener el proceso de iteración para realizar otras acciones. Es posible pausar la iteración devolviendo false de la devolución de llamada de iteración. La iteración se puede reanudar llamando al resume método en PageIterator.

int count = 0;
int pauseAfter = 25;

var messages = await graphClient.Me.Messages
    .GetAsync(requestConfiguration =>
    {
        requestConfiguration.QueryParameters.Top = 10;
        requestConfiguration.QueryParameters.Select = new string[] { "sender", "subject" };
    });

var pageIterator = PageIterator<Message, MessageCollectionResponse>
    .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();
}