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.

Como alternativa, puede usar la @odata.nextLink propiedad para solicitar manualmente páginas posteriores.

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 =
            ["sender", "subject", "body"];
        requestConfiguration.Headers.Add(
            "Prefer", "outlook.body-content-type=\"text\"");
    });

if (messages == null)
{
    return;
}

var pageIterator = PageIterator<Message, MessageCollectionResponse>
    .CreatePageIterator(
        graphClient,
        messages,
        // Callback executed for each item in
        // the collection
        (msg) =>
        {
            Console.WriteLine(msg.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 =
            ["sender", "subject"];
    });

if (messages == null)
{
    return;
}

var pageIterator = PageIterator<Message, MessageCollectionResponse>
    .CreatePageIterator(
        graphClient,
        messages,
        (msg) =>
        {
            Console.WriteLine(msg.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();
}

Solicitud manual de páginas posteriores

Como alternativa al uso de la clase PageIterator , puede comprobar manualmente la respuesta de una @odata.nextLink propiedad y solicitar la página siguiente.

var messages = await graphClient.Me.Messages
    .GetAsync(requestConfiguration =>
    {
        requestConfiguration.QueryParameters.Top = 10;
    });

while (messages?.Value != null)
{
    foreach (var message in messages.Value)
    {
        Console.WriteLine(message.Subject);
    }

    // If OdataNextLink has a value, there is another page
    if (!string.IsNullOrEmpty(messages.OdataNextLink))
    {
        // Pass the OdataNextLink to the WithUrl method
        // to request the next page
        messages = await graphClient.Me.Messages
            .WithUrl(messages.OdataNextLink)
            .GetAsync();
    }
    else
    {
        // No more results, exit loop
        break;
    }
}