Realizar búsquedas paginadas utilizando EWS en ExchangePerform paged searches by using EWS in Exchange

Descubra cómo realizar búsquedas paginadas en su API administrada de EWS o en la aplicación EWS destinada a Exchange.Find out how to perform paged searches in your EWS Managed API or EWS application that targets Exchange.

La paginación es una función de EWS que le permite controlar el tamaño de los resultados de una búsqueda.Paging is a feature in EWS that enables you to control the size of the results of a search. En lugar de recuperar el conjunto de resultados completo en una respuesta de EWS, puede recuperar conjuntos más pequeños en varias respuestas de EWS.Rather than retrieve the entire result set in one EWS response, you can retrieve smaller sets in multiple EWS responses. Por ejemplo, imagine que un usuario tiene 10 000 mensajes de correo electrónico en su bandeja de entrada.For example, consider a user with 10,000 email messages in their Inbox. Hipotéticamente, podría recuperar los 10 000 mensajes de correo electrónico en una respuesta muy grande, pero es posible que desee dividir los resultados en partes más manejables por razones de ancho de banda o rendimiento.Hypothetically, you could retrieve all 10,000 emails in one very large response, but you might want to break that up into more manageable chunks for bandwidth or performance reasons. La paginación proporciona las herramientas necesarias para hacer precisamente eso.Paging gives you the tools to do just that.

Nota

Si bien hipotéticamente puede recuperar 10 000 elementos en una solicitud, en realidad, esto es poco probable debido a la limitación de EWS.While you can hypothetically retrieve 10,000 items in one request, in reality, this is unlikely due to EWS throttling. Para obtener más información, consulte Limitación de EWS en Exchange.To find out more, see EWS throttling in Exchange.

Tabla 1. Parámetros de paginación en la API administrada de EWS y EWSTable 1. Paging parameters in the EWS Managed API and EWS

Para configurar o recuperar el…To configure or retrieve the… En la API administrada de EWS, use…In the EWS Managed API, use… En EWS, use…In EWS, use…
Número máximo de elementos o carpetas en una respuestaMaximum number of items or folders in a response
Parámetro pageSize para el constructor ItemView o el constructor FolderViewThe pageSize parameter to the ItemView constructor or the FolderView constructor
O bienOr
Propiedad PagedView.PageSizeThe PagedView.PageSize property
Atributo MaxEntriesReturned en el elemento IndexedPageItemView o el elemento IndexedPageFolderViewThe MaxEntriesReturned attribute on the IndexedPageItemView element or the IndexedPageFolderView element
Punto de partida en la lista de elementos o carpetasStarting point in the list of items or folders
Parámetro offsetBasePoint para el constructor ItemView o el constructor FolderViewThe offsetBasePoint parameter to the ItemView constructor or the FolderView constructor
O bienOr
Propiedad PagedView.OffsetBasePointThe PagedView.OffsetBasePoint property
Atributo BasePoint en el elemento IndexedPageItemView o el elemento IndexedPageFolderViewThe BasePoint attribute on the IndexedPageItemView element or the IndexedPageFolderView element
Desplazamiento desde el punto de partidaOffset from the starting point
Parámetro offset para el constructor ItemView o el constructor FolderViewThe offset parameter to the ItemView constructor or the FolderView constructor
O bienOr
Propiedad PagedView.OffsetThe PagedView.Offset property
Atributo Offset en el elemento IndexedPageItemView o el elemento IndexedPageFolderViewThe Offset attribute on the IndexedPageItemView element or the IndexedPageFolderView element
Número total de resultados en el servidorTotal number of results on the server
Propiedad FindItemsResults.TotalCount o propiedad FindFoldersResults.TotalCountThe FindItemsResults.TotalCount property or the FindFoldersResults.TotalCount property
Atributo TotalItemsInView en el elemento RootFolder (FindItemResponseMessage) o el elemento RootFolder (FindFolderResponseMessage)The TotalItemsInView attribute on the RootFolder (FindItemResponseMessage) element or the RootFolder (FindFolderResponseMessage) element
Desplazamiento del primer elemento o carpeta no incluidos en la respuesta actualOffset of first item or folder not included in current response
Propiedad FindItemsResults.NextPageOffset o propiedad FindFoldersResults.NextPageOffsetThe FindItemsResults.NextPageOffset property or the FindFoldersResults.NextPageOffset property
Atributo IndexedPagingOffset en el elemento RootFolderThe IndexedPagingOffset attribute on the RootFolder element
Indicador de que la respuesta incluye el último elemento o carpeta de la listaIndicator that response includes the last item or folder in the list
Propiedad FindItemsResults.MoreAvailable o propiedad FindFoldersResults.MoreAvailableThe FindItemsResults.MoreAvailable property or the FindFoldersResults.MoreAvailable property
Atributo IncludesLastItemInRange en el elemento RootFolderThe IncludesLastItemInRange attribute on the RootFolder element

Cómo funciona la paginaciónHow paging works

Para comprender cómo funciona la paginación, es útil visualizar los mensajes en una carpeta como vallas publicitarias alineadas una al lado de la otra en una explanada.To understand how paging works, it's helpful to visualize the messages in a folder as billboards lined up side by side in a field outside your house. Imagine que puede ver algunas de estas vallas publicitarias a través de una ventana mágica.You can see some of these billboards through a magical window. Puede cambiar el tamaño de la ventana (para ver más o menos vallas publicitarias a la vez) y mover la ventana (para controlar qué vallas publicitarias puede ver).You have the ability to change the size of the window (to see more or fewer billboards at once) and to move the window (to control which billboards you can see). Esta manipulación de la ventana es como la paginación.This manipulation of the window is paging.

Cuando envía su solicitud al servidor Exchange, especifica el tamaño de su ventana indicando cuántos artículos quiere que se devuelvan.When you send your request to the Exchange server, you specify the size of your window in terms of how many items to return. La posición de la ventana se establece especificando un punto de inicio (ya sea el comienzo de la línea o el final de la línea) y un desplazamiento desde ese punto de inicio, que se expresa como número de elementos.You set the position of the window by specifying a starting point (either the beginning of the line or the end of the line) and an offset from that starting point, expressed in a number of items. El comienzo de la ventana es el número de elementos que especifica el desplazamiento desde el punto de inicio.The beginning of the window is the number of items specified by the offset from the starting point.

Donde la paginación se vuelve un poco más interesante es en la respuesta del servidor y en la manera en la que su aplicación puede usar esa respuesta para dar forma a su próxima solicitud.Where paging gets a bit more interesting is in the server's response, and how your application can use that response to shape its next request. El servidor le proporciona tres datos que puede utilizar para determinar cómo configurar su "ventana" para su próxima solicitud:The server gives you three pieces of information that you can use to determine how to configure your "window" for your next request:

  • Si los resultados de la respuesta incluyen o no el último elemento del conjunto de resultados general en el servidor.Whether the results in the response include the last item in the overall result set on the server.

  • El número total de elementos del conjunto de resultados en el servidor.The total number of items in the result set on the server.

  • Cuál debería ser el siguiente valor del desplazamiento, si desea avanzar su ventana al siguiente elemento del conjunto de resultados que no se incluya en la respuesta actual.What the next offset value should be, if you want to advance your window to the next item in the result set that isn't included in the current response.

Veamos un ejemplo sencillo.Let's look at a simple example. Imagine una bandeja de entrada con 15 mensajes.Imagine an Inbox with 15 messages in it. Su aplicación envía una solicitud inicial para recuperar un máximo de 10 elementos, comenzando por el principio de la lista de mensajes (por lo que el desplazamiento es cero).Your application sends an initial request to retrieve a maximum of 10 items, starting at the beginning of the list of messages (so the offset is zero). El servidor responde con los primeros 10 mensajes e indica que la respuesta no incluye el último elemento, que hay un total de 15 elementos y que el próximo desplazamiento debe ser 10.The server responds with the first 10 messages, and indicates that the response does not include the last item, that there are a total of 15 items, and that the next offset should be 10.

Ilustración 1. Solicitud de 10 elementos en el desplazamiento 0 del comienzo de una lista de 15 elementosFigure 1. Requesting 10 items at offset 0 from the beginning of a list of 15 items

Un diagrama que muestra los resultados de solicitar 10 elementos en el desplazamiento 0 desde el comienzo de una lista de 15 elementos.

Luego, su aplicación reenvía la misma solicitud al servidor, con la única diferencia de que el desplazamiento es ahora 10.Your application then resends the same request to the server, with the only change being that the offset is now 10. El servidor devuelve los últimos cinco elementos e indica que la respuesta incluye el último elemento, que hay un total de 15 elementos y que el próximo desplazamiento debe ser 15 (aunque, obviamente, como ha llegado al final, no habrá un próximo desplazamiento).The server returns the last five items, and indicates that the response does include the last item, that there are a total of 15 items, and that the next offset should be 15 (though of course, you've reached the end, so there won't be a next offset.)

Ilustración 2. Solicitud de 10 elementos en el desplazamiento 10 del principio de una lista de 15 elementosFigure 2. Requesting 10 items at offset 10 from the beginning of a list of 15 items

Diagrama que muestra los resultados de solicitar 10 elementos en el desplazamiento 10 desde el comienzo de una lista de 15 elementos.

Consideraciones de diseño para la paginaciónDesign considerations for paging

Aprovechar al máximo la paginación en su aplicación requiere tener en cuenta ciertos aspectos.Making the most out of paging in your application does require some consideration. Por ejemplo, ¿cuál será el tamaño de su "ventana"?For example, how large do you make your "window"? ¿Qué hará si los resultados en el servidor cambian mientras mueve su "ventana"?What do you do if the results on the server change while you're moving your "window"?

Determinar el tamaño de su ventanaDetermine the size of your window

No existe un número máximo de entradas "único" que todas las aplicaciones deban utilizar.There is no "one-size-fits-all" maximum number of entries that all applications should use. Determinar el número adecuado para su aplicación depende de varios factores.Determining the number that's right for your application depends on several different factors. Sin embargo, es útil tener en cuenta las siguientes pautas:However, it's helpful to keep the following guidelines in mind:

  • De forma predeterminada, Exchange establece que el número máximo de artículos que se pueden devolver en una sola solicitud sea 1000.By default, Exchange limits the maximum number of items that can be returned in a single request to 1000.

  • Establecer el número máximo de entradas en un número mayor da como resultado tener que enviar menos solicitudes para obtener todos los elementos, pero se deberá esperar más tiempo para obtener respuestas.Setting the maximum number of entries to a larger number results in having to send fewer requests to get all items, at the cost of having to wait longer for responses.

  • Establecer el número máximo de entradas en un número menor da como resultado tiempos de respuesta más rápidos, pero implica enviar más solicitudes para obtener todos los elementos.Setting the maximum number of entries to a smaller number results in quicker response times, at the cost of having to send more requests to get all items.

Gestionar cambios en el conjunto de resultadosHandling changes to the result set

En el ejemplo simple de este artículo, el número de elementos en la bandeja de entrada del usuario se mantuvo constante.In the simple example earlier in this article, the number of items in the user's Inbox remained constant. Sin embargo, en realidad, la cantidad de elementos de una bandeja de entrada puede cambiar con frecuencia.However, in reality, the number of items in an Inbox can change frequently. Pueden llegar nuevos mensajes y los elementos se pueden eliminar o mover en cualquier momento.New messages can arrive and items can be deleted or moved at any time. Pero, ¿cómo afecta esto a la paginación?But how does this impact paging? Modifiquemos el escenario de ejemplo anterior para averiguarlo.Let's modify the earlier example scenario to find out.

Comenzaremos de nuevo con los 15 elementos de la bandeja de entrada del usuario y enviaremos la misma solicitud inicial.We'll start again with the 15 items in the user's Inbox, and send the same initial request. Como antes, el servidor responde con los primeros 10 mensajes e indica que la respuesta no incluye el último elemento, que hay un total de 15 elementos y que el siguiente desplazamiento debe ser 10, como se muestra en la ilustración 1.As before, the server responds with the first 10 messages, and indicates that the response does not include the last item, that there are a total of 15 items, and that the next offset should be 10, as shown in Figure 1.

Ahora, mientras su aplicación procesa esos 10 elementos, llega un nuevo mensaje a la bandeja de entrada y se agrega al conjunto de resultados en el servidor.Now, while your application is processing those 10 items, a new message arrives in the Inbox and is added to the result set on the server. Su aplicación reenvía la misma solicitud al servidor (solo con el desplazamiento establecido en 10).Your application resends the same request to the server (only with the offset set to 10). Esta vez, el servidor recupera 6 elementos e indica que hay un total de 16 elementos en el conjunto de resultados.This time the server gets back six items, and indicates that there are a total of 16 items in the result set.

En este punto, es posible que se pregunte si esto es un problema.At this point you might be wondering if this is even a problem. Después de todo, obtuvo 16 elementos en las dos respuestas, así que ¿por qué podría ser esto un problema?After all, you got 16 items back over the two responses, so why all the fuss? La respuesta depende de en qué lugar de la lista se coloque el nuevo elemento.The answer depends on where in the list the new item is placed. Si la lista está ordenada de modo que los elementos más antiguos (por fecha/hora de recepción) sean los primeros, no hay motivo de preocupación en este escenario.If the list is sorted so that the oldest items (by received date/time) are first, there's no cause for concern in this scenario. El nuevo elemento se colocará al final de la lista y se incluirá en la segunda respuesta.The new item will be placed at the end of the list, and will be included in the second response.

Ilustración 3. Solicitud de 10 elementos en el desplazamiento 10 desde el principio de una lista de 16 elementos, siendo nuevo el elemento 16 de la listaFigure 3. Requesting 10 items at offset 10 from the beginning of a list of 16 items, with the 16th item in the list being new

Diagrama que muestra los resultados de solicitar 10 elementos en el desplazamiento 10 desde el principio de una lista de 16 elementos cuando el elemento 16 se agregó al final de la lista.

Si la lista está ordenada para que los elementos más nuevos sean los primeros, cambia la historia.If the list is sorted so that the newest items are first, it's a different story. En este caso, el primer elemento de la segunda solicitud sería el último elemento de la solicitud anterior más los cinco elementos restantes de los 15 originales.In this case, the first item in the second request would be the last item from the previous request plus the remaining five items from the original 15. Para decirlo en términos de nuestra ventana mágica imaginaria, cambió su ventana 10 posiciones, pero las vallas publicitarias también avanzaron una posición.To put it in terms of our imaginary magical window, you shifted your window's position by 10, but the billboards themselves also shifted by 1.

Ilustración 4. Solicitud de 10 elementos en el desplazamiento 10 desde el principio de una lista de 16 elementos, siendo nuevo el primer elemento de la listaFigure 4. Requesting 10 items at offset 10 from the beginning of a list of 16 items, with the first item in the list being new

Diagrama que muestra los resultados de la solicitud de 10 elementos con un desplazamiento 10 desde el principio de una lista de 16 elementos cuando el elemento número 16 se agregó al comienzo de la lista.

Una forma de detectar un cambio en los resultados en el servidor es utilizar el concepto de elemento delimitador.One way to detect a change to the results on the server is to use the concept of an anchor item. Un elemento delimitador es un elemento adicional en su respuesta que no se procesa junto con el resto de los resultados, pero se utiliza para realizar una comparación con los siguientes resultados para ver si los elementos han cambiado.An anchor item is an additional item in your response that is not processed along with the rest of the results, but is used to compare with the next results to see if the items themselves have shifted. Volviendo a nuestro ejemplo simple, si su aplicación utiliza un tamaño de "ventana" de 10, en realidad establece que el número máximo de elementos que se pueda devolver sea 11.Building again on our simple example, if your application is using a "window" size of 10, you actually set the maximum number of items to return to 11. Su aplicación procesa los primeros 10 elementos de la respuesta como de costumbre.Your application processes the first 10 items in the response as usual. Para el último elemento, guarde el identificador del elemento como delimitador y, luego, emita la siguiente solicitud con un desplazamiento de 10.For the last item, you save the item's identifier as an anchor, then issue the next request with an offset of 10. Si los datos no han cambiado, el primer elemento de la segunda respuesta deberá tener un identificador de elemento que coincida con el delimitador.If the data has not changed, the first item in the second response should have an item identifier that matches the anchor. Si los identificadores de elemento no coinciden, sabrá que los datos se han eliminado o insertado en las partes de la lista en las que ya ha aplicado la paginación.If the item identifiers don't match, you know that the data has been removed or inserted in the parts of the list you have already "paged" over.

Incluso aunque sepa que los datos han cambiado, deberá decidir cómo actuar en consecuencia.Even when you know that the data has changed, you still need to decide how to react. Tampoco existe una respuesta única a esta pregunta.There isn't a one-size-fits-all answer for this question either. Sus acciones dependerán de su tipo de aplicación y de lo importante que sea capturar todos los elementos.Your actions will depend on the nature of your application and how critical it is to capture all items. Puede ignorar los cambios por completo, reiniciar el proceso desde el principio o retroceder e intentar detectar dónde se produjo el cambio.You might ignore it altogether, restart the process from the beginning, or back track and try to detect where the change happened.

Ejemplo: realizar una búsqueda paginada mediante la API administrada de EWSExample: Perform a paged search by using the EWS Managed API

La paginación es compatible con los siguientes métodos de API administrada de EWS:Paging is supported by the following EWS Managed API methods:

Si utiliza la API administrada de EWS, su aplicación configurará la paginación con la clase ItemView o FolderView y recibirá información del servidor con respecto a la paginación de la clase FindItemsResults o FindFoldersResults.If you are using the EWS Managed API, your application configures paging with the ItemView or FolderView class and receives information from the server regarding paging from the FindItemsResults or FindFoldersResults class.

En el siguiente ejemplo se recuperan todos los elementos de una carpeta mediante una búsqueda paginada que devuelve cinco elementos en cada respuesta.The following example retrieves all the items in a folder using a paged search that returns five items in each response. También se recupera un elemento adicional que sirve como delimitador para detectar cambios en los resultados en el servidor.It also retrieves an additional item to serve as an anchor to detect changes to the results on the server.

En este ejemplo se asume que el objeto ExchangeService se ha inicializado con valores válidos en las propiedades Credentials y Url.This example assumes that the ExchangeService object has been initialized with valid values in the Credentials and Url properties.

using Microsoft.Exchange.WebServices.Data;
static void PageSearchItems(ExchangeService service, WellKnownFolderName folder)
{
    int pageSize = 5;
    int offset = 0;
    // Request one more item than your actual pageSize.
    // This will be used to detect a change to the result
    // set while paging.
    ItemView view = new ItemView(pageSize + 1, offset);
    view.PropertySet = new PropertySet(ItemSchema.Subject);
    view.OrderBy.Add(ItemSchema.DateTimeReceived, SortDirection.Descending);
    view.Traversal = ItemTraversal.Shallow;
    bool moreItems = true;
    ItemId anchorId = null;
    while (moreItems)
    {
        try
        {
            FindItemsResults<Item> results = service.FindItems(folder, view);
            moreItems = results.MoreAvailable;
            if (moreItems && anchorId != null)
            {
                // Check the first result to make sure it matches
                // the last result (anchor) from the previous page.
                // If it doesn't, that means that something was added
                // or deleted since you started the search.
                if (results.Items.First<Item>().Id != anchorId)
                {
                    Console.WriteLine("The collection has changed while paging. Some results may be missed.");
                }
            }
            if (moreItems)
                view.Offset += pageSize;
                
            anchorId = results.Items.Last<Item>().Id;
            
            // Because you're including an additional item on the end of your results
            // as an anchor, you don't want to display it.
            // Set the number to loop as the smaller value between
            // the number of items in the collection and the page size.
            int displayCount = 0;
            if ((results.MoreAvailable == false && results.Items.Count > pageSize) || (results.Items.Count < pageSize))
            {
                displayCount = results.Items.Count;
            }
            else
            {
                displayCount = pageSize;
            }
            
            for (int i = 0; i < displayCount; i++)
            {
                Item item = results.Items[i];
                Console.WriteLine("Subject: {0}", item.Subject);
                Console.WriteLine("Id: {0}\n", item.Id.ToString());
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception while paging results: {0}", ex.Message);
        }
    }
}

Ejemplo: realizar una búsqueda paginada mediante EWSExample: Perform a paged search by using EWS

La paginación es compatible con las siguientes operaciones de EWS:Paging is supported by the following EWS operations:

Si utiliza EWS, su aplicación configurará la paginación con el elemento IndexedPageItemView o el elemento IndexedPageFolderView y recibirá información del servidor con respecto a la paginación del elemento RootFolder (FindItemResponseMessage) o del elemento RootFolder (FindFolderResponseMessage).If you're using EWS, your application configures paging with the IndexedPageItemView element or the IndexedPageFolderView element and receives information from the server regarding paging from the RootFolder (FindItemResponseMessage) element or the RootFolder (FindFolderResponseMessage) element.

En este ejemplo de solicitud, se enviará una solicitud FindItem para un máximo de seis elementos, comenzando con un desplazamiento de cero desde el comienzo de la lista de elementos en la bandeja de entrada del usuario.In this request example, a FindItem request is sent for a maximum of six items, starting at an offset of zero from the beginning of the list of items in the user's Inbox.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages" 
    xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types" 
    xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2007_SP1" />
    <t:TimeZoneContext>
      <t:TimeZoneDefinition Id="Eastern Standard Time" />
    </t:TimeZoneContext>
  </soap:Header>
  <soap:Body>
    <m:FindItem Traversal="Shallow">
      <m:ItemShape>
        <t:BaseShape>IdOnly</t:BaseShape>
        <t:AdditionalProperties>
          <t:FieldURI FieldURI="item:Subject" />
        </t:AdditionalProperties>
      </m:ItemShape>
      <m:IndexedPageItemView MaxEntriesReturned="6" Offset="0" BasePoint="Beginning" />
      <m:ParentFolderIds>
        <t:DistinguishedFolderId Id="inbox" />
      </m:ParentFolderIds>
    </m:FindItem>
  </soap:Body>
</soap:Envelope>

El servidor devuelve la siguiente respuesta, que contiene seis elementos.The server returns the following response, which contains six items. La respuesta también indica que hay un total de ocho elementos en los resultados del servidor y que el último elemento de la lista de resultados no está presente en esta respuesta.The response also indicates that there are a total of eight items in the results on the server, and that the last item in the results list is not present in this response.

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <h:ServerVersionInfo MajorVersion="15" MinorVersion="0" MajorBuildNumber="775" MinorBuildNumber="35" Version="V2_4" 
        xmlns:h="https://schemas.microsoft.com/exchange/services/2006/types" 
        xmlns="https://schemas.microsoft.com/exchange/services/2006/types" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <m:FindItemResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages" 
        xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
      <m:ResponseMessages>
        <m:FindItemResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
          <m:RootFolder IndexedPagingOffset="6" TotalItemsInView="8" IncludesLastItemInRange="false">
            <t:Items>
              <t:Message>
                <t:ItemId Id="AAMkAGM2..." ChangeKey="CQAAABYA..." />
                <t:Subject>Query</t:Subject>
              </t:Message>
              <t:Message>
                <t:ItemId Id="AAMkAGM2..." ChangeKey="CQAAABYA..." />
                <t:Subject>Update</t:Subject>
              </t:Message>
              <t:Message>
                <t:ItemId Id="AAMkAGM2..." ChangeKey="CQAAABYA..." />
                <t:Subject>Planning resources</t:Subject>
              </t:Message>
              <t:Message>
                <t:ItemId Id="AAMkAGM2..." ChangeKey="CQAAABYA..." />
                <t:Subject>Timeline</t:Subject>
              </t:Message>
              <t:Message>
                <t:ItemId Id="AAMkAGM2..." ChangeKey="CQAAABYA..." />
                <t:Subject>For your perusal</t:Subject>
              </t:Message>
              <t:Message>
                <t:ItemId Id="AAMkAGM2..." ChangeKey="CQAAABYA..." />
                <t:Subject>meeting notes</t:Subject>
              </t:Message>
            </t:Items>
          </m:RootFolder>
        </m:FindItemResponseMessage>
      </m:ResponseMessages>
    </m:FindItemResponse>
  </s:Body>
</s:Envelope>

En este ejemplo, se envía la misma solicitud, pero esta vez, el atributo Offset se cambia a cinco, lo que indica que el servidor debe devolver como máximo seis elementos comenzando en el desplazamiento cinco desde el principio.In this example, the same request is sent, but this time, the Offset attribute is changed to five, which indicates that the server should return at most six items starting at offset five from the beginning.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages" 
    xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types" 
    xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2007_SP1" />
    <t:TimeZoneContext>
      <t:TimeZoneDefinition Id="Eastern Standard Time" />
    </t:TimeZoneContext>
  </soap:Header>
  <soap:Body>
    <m:FindItem Traversal="Shallow">
      <m:ItemShape>
        <t:BaseShape>IdOnly</t:BaseShape>
        <t:AdditionalProperties>
          <t:FieldURI FieldURI="item:Subject" />
        </t:AdditionalProperties>
      </m:ItemShape>
      <m:IndexedPageItemView MaxEntriesReturned="6" Offset="5" BasePoint="Beginning" />
      <m:ParentFolderIds>
        <t:DistinguishedFolderId Id="inbox" />
      </m:ParentFolderIds>
    </m:FindItem>
  </soap:Body>
</soap:Envelope>

El servidor envía la siguiente respuesta, que contiene tres elementos.The server sends the following response, which contains three items. La respuesta también indica que el número total de elementos de los resultados en el servidor sigue siendo ocho y que el último elemento de la lista de resultados se incluye en esta respuesta.The response also indicates that the total number of items in the results on the server is still eight, and that the last item in the results list is included in this response.

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <h:ServerVersionInfo MajorVersion="15" MinorVersion="0" MajorBuildNumber="775" MinorBuildNumber="35" Version="V2_4" 
        xmlns:h="https://schemas.microsoft.com/exchange/services/2006/types" 
        xmlns="https://schemas.microsoft.com/exchange/services/2006/types" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <m:FindItemResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages" 
    xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
      <m:ResponseMessages>
        <m:FindItemResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
          <m:RootFolder IndexedPagingOffset="8" TotalItemsInView="8" IncludesLastItemInRange="true">
            <t:Items>
              <t:Message>
                <t:ItemId Id="AAMkAGM2..." ChangeKey="CQAAABYA..." />
                <t:Subject>meeting notes</t:Subject>
              </t:Message>
              <t:Message>
                <t:ItemId Id="AAMkAGM2..." ChangeKey="CQAAABYA..." />
                <t:Subject>Meeting notes</t:Subject>
              </t:Message>
              <t:Message>
                <t:ItemId Id="AAMkAGM2..." ChangeKey="CQAAABYA..." />
                <t:Subject>This cat is hilarious!</t:Subject>
              </t:Message>
            </t:Items>
          </m:RootFolder>
        </m:FindItemResponseMessage>
      </m:ResponseMessages>
    </m:FindItemResponse>
  </s:Body>
</s:Envelope>

Vea tambiénSee also