Выполнение страничного поиска с помощью EWS в ExchangePerform paged searches by using EWS in Exchange

Узнайте, как выполнять страничный поиск в управляемом API EWS или приложении EWS, предназначенном для Exchange.Find out how to perform paged searches in your EWS Managed API or EWS application that targets Exchange.

Разбиение на страницы — это функция в EWS, которая позволяет управлять размером результатов поиска.Paging is a feature in EWS that enables you to control the size of the results of a search. Вместо получения всех результатов в одном ответе EWS можно получить меньше результатов в нескольких ответах EWS. Rather than retrieve the entire result set in one EWS response, you can retrieve smaller sets in multiple EWS responses. Например, представьте, что в папке "Входящие" пользователя находится 10 000 сообщений электронной почты.For example, consider a user with 10,000 email messages in their Inbox. Гипотетически можно получать все 10 000 сообщений электронной почты в одном огромном ответе, но можно разбить его на более доступные для управления блоки по соображениям пропускной способности или производительности.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. Разбиение на страницы дает вам инструменты для этого.Paging gives you the tools to do just that.

Примечание

Хотя можно получить 10 000 элементов в одном запросе, в действительности это маловероятно из-за регулирования EWS.While you can hypothetically retrieve 10,000 items in one request, in reality, this is unlikely due to EWS throttling. Дополнительные сведения см. в разделе регулирование EWS в Exchange.To find out more, see EWS throttling in Exchange.

Таблица 1. Параметры разбиения на страницы в управляемом API EWS и EWSTable 1. Paging parameters in the EWS Managed API and EWS

Чтобы настроить или получить...To configure or retrieve the… В управляемом API EWS, используйте...In the EWS Managed API, use… В EWS используйте...In EWS, use…
Максимальное количество элементов или папок в ответеMaximum number of items or folders in a response
Параметр pageSize конструктора ItemView или конструктора FolderViewThe pageSize parameter to the ItemView constructor or the FolderView constructor
ИлиOr
Свойство PagedView.PageSizeThe PagedView.PageSize property
Атрибут MaxEntriesReturned элемента IndexedPageItemView или элемента IndexedPageFolderViewThe MaxEntriesReturned attribute on the IndexedPageItemView element or the IndexedPageFolderView element
Начальная точка в списке элементов или папокStarting point in the list of items or folders
Параметр offsetBasePoint конструктора ItemView или конструктора FolderViewThe offsetBasePoint parameter to the ItemView constructor or the FolderView constructor
ИлиOr
Свойство PagedView.OffsetBasePointThe PagedView.OffsetBasePoint property
Атрибут BasePoint элемента IndexedPageItemView или элемента IndexedPageFolderViewThe BasePoint attribute on the IndexedPageItemView element or the IndexedPageFolderView element
Смещение от начальной точкиOffset from the starting point
Параметр offset конструктора ItemView или конструктора FolderViewThe offset parameter to the ItemView constructor or the FolderView constructor
ИлиOr
Свойство PagedView.OffsetThe PagedView.Offset property
Атрибут Offset элемента IndexedPageItemView элемента IndexedPageFolderViewThe Offset attribute on the IndexedPageItemView element or the IndexedPageFolderView element
Общее число результатов на сервереTotal number of results on the server
Свойство FindItemsResults.TotalCount или свойство FindFoldersResults.TotalCountThe FindItemsResults.TotalCount property or the FindFoldersResults.TotalCount property
Атрибут TotalItemsInView элемента RootFolder (FindItemResponseMessage) или элемента RootFolder (FindFolderResponseMessage)The TotalItemsInView attribute on the RootFolder (FindItemResponseMessage) element or the RootFolder (FindFolderResponseMessage) element
Смещение первого элемента или папки, не включенных в текущий ответOffset of first item or folder not included in current response
Свойство FindItemsResults.NextPageOffset или свойство FindFoldersResults.NextPageOffsetThe FindItemsResults.NextPageOffset property or the FindFoldersResults.NextPageOffset property
Атрибут IndexedPagingOffset элемента RootFolderThe IndexedPagingOffset attribute on the RootFolder element
Индикатор того, что ответ включает последний элемент или папку в спискеIndicator that response includes the last item or folder in the list
Свойство FindItemsResults.MoreAvailable или свойство FindFoldersResults.MoreAvailableThe FindItemsResults.MoreAvailable property or the FindFoldersResults.MoreAvailable property
Атрибут IncludesLastItemInRange элемента RootFolderThe IncludesLastItemInRange attribute on the RootFolder element

Как работает разбиение на страницыHow paging works

Чтобы понять, как работает разбиение на страницы, можно визуализировать сообщения в папке, чтобы они отображались в виде рекламных щитов, выстроенных бок о бок в поле за вашим домом.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. Некоторые из этих рекламных щитов можно увидеть через волшебное окно.You can see some of these billboards through a magical window. У вас есть возможность изменять размер окна (чтобы видеть больше или меньше рекламных щитов одновременно) и перемещать окно (чтобы управлять тем, какие рекламные щиты вы видите).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). Эта манипуляция с окном и есть разбиение на страницы.This manipulation of the window is paging.

При отправке запроса на сервер Exchange Server необходимо определить размер окна с точки зрения количества элементов, которые необходимо вернуть.When you send your request to the Exchange server, you specify the size of your window in terms of how many items to return. Установить положение окна можно задав начальную точку (начало строки или конец строки) и смещение от этой начальной точки, выраженное в количестве элементов.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. Начало окна — это количество элементов, заданное смещением от начальной точки.The beginning of the window is the number of items specified by the offset from the starting point.

Разбиение на страницы более интереснее в ответе сервера и в том, как ваше приложение может использовать этот ответ для формирования следующего запроса.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. Сервер предоставляет три фрагмента сведений, которые можно использовать, чтобы определить, как настроить ваше «окно» для вашего следующего запроса:The server gives you three pieces of information that you can use to determine how to configure your "window" for your next request:

  • Включают ли результаты в ответ последний элемент в общие результаты на сервере.Whether the results in the response include the last item in the overall result set on the server.

  • Общее количество элементов в результатах на сервере.The total number of items in the result set on the server.

  • Каким должно быть следующее значение смещения, если вы хотите переместить ваше окно к следующему элементу в результатах, который не включен в текущий ответ.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.

Рассмотрим простой пример.Let's look at a simple example. Представьте папку "Входящие" с 15 сообщениями.Imagine an Inbox with 15 messages in it. Приложение отправляет начальный запрос на получение не более 10 элементов, начиная с начала списка сообщений (поэтому смещение равно нулю).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). Сервер отвечает первыми 10 сообщениями и указывает, что ответ не включает последний элемент, что всего присутствует 15 элементов и что следующее смещение должно быть равно 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.

Рисунок 1. Запрос 10 элементов с нулевым смещением от начала списка, состоящего из 15 элементовFigure 1. Requesting 10 items at offset 0 from the beginning of a list of 15 items

Диаграмма, на которой показаны результаты запроса 10 элементов с нулевым смещением от начала списка, состоящего из 15 элементов.

Приложение повторно отправляет тот же запрос на сервер с единственным изменением, заключающимся в том, что теперь смещение равно 10.Your application then resends the same request to the server, with the only change being that the offset is now 10. Сервер возвращает последние пять элементов и указывает, что в ответе содержится последний элемент, что всего присутствует 15 элементов, а следующее смещение должно быть равно 15 (хотя конец достигнут, поэтому следующего смещения не будет.)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.)

Рисунок 2. Запрос 10 элементов со смещением 10 от начала списка, состоящего из 15 элементовFigure 2. Requesting 10 items at offset 10 from the beginning of a list of 15 items

Диаграмма, на которой показаны результаты запроса 10 элементов со смещением 10 от начала списка, состоящего из 15 элементов.

Анализ дизайна для разбиения на страницыDesign considerations for paging

Чтобы максимально эффективно использовать разбиение на страницы в приложении, необходимо учитывать некоторые вопросы.Making the most out of paging in your application does require some consideration. Например, насколько большим можно сделать "окно"?For example, how large do you make your "window"? Что делать, если результаты на сервере меняются при перемещении «окна»?What do you do if the results on the server change while you're moving your "window"?

Определение размера окнаDetermine the size of your window

Не существует универсального максимального количества записей, которое должны использовать все приложения.There is no "one-size-fits-all" maximum number of entries that all applications should use. Выбор числа, подходящего для вашего приложения, зависит от нескольких факторов.Determining the number that's right for your application depends on several different factors. Тем не менее, рекомендуется учитывать следующие моменты:However, it's helpful to keep the following guidelines in mind:

  • По умолчанию Exchange ограничивает максимальное количество элементов, которые могут быть возвращены в одном запросе, до 1000.By default, Exchange limits the maximum number of items that can be returned in a single request to 1000.

  • Установка максимального числа записей на большее количество элементов приводит к необходимости отправлять меньше запросов для получения всех элементов за счет более длительного ожидания ответов.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.

  • Установка максимального количества записей на меньшее количество элементов приводит к более быстрому времени отклика за счет необходимости отправлять больше запросов для получения всех элементов.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.

Обработка изменений в результирующем набореHandling changes to the result set

В простом примере, приведенном ранее в этой статье, количество элементов в папке «Входящие» пользователя оставалось постоянным.In the simple example earlier in this article, the number of items in the user's Inbox remained constant. Однако в действительности количество элементов в папке «Входящие» может часто меняться.However, in reality, the number of items in an Inbox can change frequently. Новые сообщения могут приходить, а элементы могут быть удалены или перемещены в любое время.New messages can arrive and items can be deleted or moved at any time. Но как это повлияет на разбиение на страницы?But how does this impact paging? Давайте изменим предыдущий примерный сценарий, чтобы выяснить это.Let's modify the earlier example scenario to find out.

Начнем снова с 15 элементов в папке «Входящие» пользователя и отправим тот же начальный запрос.We'll start again with the 15 items in the user's Inbox, and send the same initial request. Как и раньше, сервер отвечает первыми 10 сообщениями и указывает, что ответ не включает последний элемент, что всего присутствует 15 элементов и что следующее смещение должно быть равно 10, как показано на рисунке 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.

Пока приложение обрабатывает эти 10 элементов, новое сообщение поступает в папку «Входящие» и добавляется в результирующий набор на сервере.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. Приложение повторно отправляет тот же запрос на сервер (только с установленным смещением 10).Your application resends the same request to the server (only with the offset set to 10). На этот раз сервер возвращает шесть элементов и указывает, что всего в результирующем наборе 16 элементов.This time the server gets back six items, and indicates that there are a total of 16 items in the result set.

На этом этапе вам может быть интересно, действительно ли это проблема.At this point you might be wondering if this is even a problem. В конце концов, вы получили 16 элементов по двум ответам, так в чем проблема?After all, you got 16 items back over the two responses, so why all the fuss? Ответ зависит от того, где в списке размещен новый элемент.The answer depends on where in the list the new item is placed. Если список отсортирован так, что самые старые элементы (по дате и времени получения) идут первыми, то с этим сценарием все в порядке.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. Новый элемент будет помещен в конец списка и будет включен во второй ответ.The new item will be placed at the end of the list, and will be included in the second response.

Рисунок 3. Запрос 10 элементов со смещением 10 от начала списка, состоящего из 16 элементов, при этом 16-й элемент в списке является новымFigure 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

Диаграмма, на которой показаны результаты запроса 10 элементов со смещением 10 от начала списка, состоящего из 16 элементов, где 16-й элемент добавлен в начало списка.

Другое дело, если список отсортирован так, что на первом месте находятся самые новые элементы.If the list is sorted so that the newest items are first, it's a different story. В этом случае первый элемент во втором запросе будет последним элементом из предыдущего запроса плюс оставшиеся пять элементов из исходных 15.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. Выражаясь в терминах нашего воображаемого волшебного окна, вы сместили положение своего окна на 10, но сами рекламные щиты также сдвинулись на 1.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.

Рисунок 4. Запрос 10 элементов со смещением 10 от начала списка, состоящего из 16 элементов, при этом первый элемент в списке является новымFigure 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

Диаграмма, на которой показаны результаты запроса 10 элементов со смещением 10 от начала списка, состоящего из 16 элементов, где 16-й элемент добавлен в начало списка.

Один из способов выявления изменения результатов на сервере является использование концепции элемента привязки.One way to detect a change to the results on the server is to use the concept of an anchor item. Элемент привязки — это дополнительный элемент в ответе, который не обрабатывается вместе с остальными результатами, но используется для сравнения со следующей результатами, чтобы проверить, сместились ли сами элементы.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. Опять же, основываясь на нашем простом примере, если приложение использует размер «окна» равный 10, вы фактически устанавливаете максимальное количество возвращаемых элементов равным 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. Приложение обрабатывает первые 10 элементов ответа обычным способом.Your application processes the first 10 items in the response as usual. Для последнего элемента вы сохраняете идентификатор элемента в качестве элемента привязки, а затем отправляете следующий запрос со смещением 10.For the last item, you save the item's identifier as an anchor, then issue the next request with an offset of 10. Если данные не изменились, первый элемент во втором ответе должен иметь идентификатор элемента, соответствующий привязке.If the data has not changed, the first item in the second response should have an item identifier that matches the anchor. Если идентификаторы элементов не совпадают, вы знаете, что данные были удалены или вставлены в те части списка, которые вы уже «перелистали».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.

Даже если вы знаете, что данные изменились, вам все равно нужно решить, как реагировать.Even when you know that the data has changed, you still need to decide how to react. На этот вопрос также не существует универсального ответа.There isn't a one-size-fits-all answer for this question either. Ваши действия будут зависеть от характера вашего приложения и от того, насколько важно захватить все элементы.Your actions will depend on the nature of your application and how critical it is to capture all items. Можно проигнорировать это, перезапустить процесс с самого начала или вернуться назад и попытаться определить, где произошло изменение.You might ignore it altogether, restart the process from the beginning, or back track and try to detect where the change happened.

Пример: Выполнение страничного поиска с помощью управляемого API EWSExample: Perform a paged search by using the EWS Managed API

Разбиение на страницы поддерживается следующими методами управляемого API EWS:Paging is supported by the following EWS Managed API methods:

При использовании управляемого API EWS приложение настраивает разбиение на страницы с помощью класса ItemView или FolderView и получает с сервера сведения о разбиении на страницы из класса FindItemsResults или 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.

В следующем примере все элементы в папке извлекаются с помощью страничного поиска, который возвращает пять элементов в каждом ответе.The following example retrieves all the items in a folder using a paged search that returns five items in each response. Он также извлекает дополнительный элемент, который будет использоваться в качестве привязки для обнаружения изменений результатов на сервере.It also retrieves an additional item to serve as an anchor to detect changes to the results on the server.

В этом примере предполагается, что для объекта ExchangeService выполнена инициализация с допустимыми значениями в свойствах Credentials и 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);
        }
    }
}

Пример: Выполнение страничного поиска с помощью EWSExample: Perform a paged search by using EWS

Разбиение на страницы поддерживается следующими операциями EWS:Paging is supported by the following EWS operations:

При использовании EWS приложение настраивает разбиение на страницы с помощью элемента IndexedPageItemView или элемента IndexedPageFolderView и получает с сервера сведения о разбиении на страницы из элемента RootFolder (FindItemResponseMessage) или элемента 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.

В этом примере запроса запрос FindItem отправляется максимум для шести элементов, начиная с нулевого смещения от начала списка элементов в папке «Входящие» пользователя.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>

Сервер возвращает следующий ответ, содержащий шесть элементов.The server returns the following response, which contains six items. Ответ также указывает, что в результатах на сервере содержится всего восемь элементов, а в этом ответе не присутствует последний элемент в списке результатов.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>

В этом примере отправляется тот же запрос, но на этот раз атрибут Offset изменен на 5, что указывает на то, что сервер должен вернуть не более шести элементов, начиная со смещения, равного пяти от начала.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>

Сервер отправляет следующий ответ, содержащий три элемента.The server sends the following response, which contains three items. Ответ также указывает, что общее количество элементов в результатах на сервере по-прежнему равно восьми, и что последний элемент в списке результатов включен в этот ответ.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>

См. такжеSee also