Поделиться через


Запрос журнала изменений SharePoint с помощью классов ChangeQuery и ChangeToken

Используйте ChangeQuery и ChangeToken , чтобы запросить в журнале изменений SharePoint изменения, внесенные в базу данных контента SharePoint, семейство веб-сайтов, сайт или список.

Область применения: SharePoint 2013 | надстройки SharePoint | SharePoint Online

Вы можете запросить журнал изменений SharePoint с помощью ChangeQuery и ChangeToken для поиска и обработки изменений, внесенных в базу данных контента, семейство веб-сайтов, сайт или список SharePoint.

В примере кода Core.ListItemChangeMonitor показано, как использовать журнал изменений SharePoint для поиска и обработки изменений, внесенных в список SharePoint. С его помощью можно:

  • Отслеживать изменения списка, сайта, семейства веб-сайтов или базы данных контента в SharePoint.

  • Начать бизнес-процесс после изменения, внесенного в элемент в списке.

  • Дополнить удаленный приемник событий. Использование шаблона журнала изменений с удаленным приемником событий дает более надежную архитектуру для обработки всех изменений, внесенных в базы данных контента, семейства веб-сайтов, сайты и списки SharePoint. Удаленные приемники событий выполняются незамедлительно, но так как это происходит на удаленном сервере, могут возникнуть ошибки связи. Шаблон журнала изменений позволяет обрабатывать все изменения, но приложение, которое этим занимается, обычно выполняется по расписанию (например, задание таймера). Это означает, что изменения не обрабатываются немедленно. При совместном использовании этих двух шаблонов, убедитесь, что реализован механизм предотвращения двойной обработки одного и того же изменения. Дополнительные сведения см. в статье Использование удаленных приемников событий в SharePoint.

До начала работы

Чтобы приступить к работе, скачайте пример надстройки Core.ListItemChangeMonitor из проекта Office 365 Developer patterns and practices (Шаблоны и методики разработки для Office 365) на портале GitHub.

Прежде чем запустить этот пример кода, выполните следующие действия.

  1. Войдите на сайт Office 365, где нужно создать список.

  2. Выберите Контент сайта.

  3. Выберите добавить надстройку.

  4. Выберите Настраиваемый список.

  5. В поле Имя введите TestList.

  6. Нажмите кнопку Создать.

Чтобы увидеть демонстрацию этого примера кода, выполните указанные ниже действия:

  1. Нажмите кнопку Пуск в Visual Studio.

  2. Введите URL-адрес сайта Office 365, имя списка (TestList) и учетные данные Office 365. Теперь консольное приложение ожидает внесения изменений в TestList. По умолчанию приложение проверяет журнал изменений и обновляет отображение каждые 30 секунд.

  3. Добавьте новый элемент в TestList:

    1. Откройте сайт Office 365 и перейдите в разделТестовый списоксодержимого> сайта.

    2. Выберите новый элемент.

    3. Введите MyTitle в поле Заголовок, а затем нажмите Сохранить.

  4. Убедитесь, что изменение отображается в консольном приложении. Вы можете заставить консольное приложение читать журнал изменений SharePoint, введя r в консольном приложении.

Использование надстройки Core.ListItemChangeMonitor

В Файле Program.cs метод Main вызывает DoWork для чтения и обработки журнала изменений SharePoint:

  1. Создайте объект ChangeQuery для доступа к журналу изменений SharePoint.

  2. Используйте журнал изменений для получения изменений элементов с помощью cq.Item = true. К изменениям относятся:

    • новые элементы, добавленные с помощью cq.Add= true;

    • Удаленные элементы с помощью cq. DeleteObject = true.

    • элементы, измененные с помощью cq.Update=true.

  3. Создайте объект ChangeToken для чтения изменений из журнала изменений на определенный момент времени.

  4. Укажите в параметре ChangeToken.StringValue номер версии, область изменения, GUID TestList, дату и время изменения, а также значение измененного элемента в ChangeToken (инициализируется со значением -1). Этот пример кода ограничивает число изменений, считываемых из журнала изменений, задавая дату и время изменения как два предыдущих дня, используя DateTime.Now.AddDays(-2).ToUniversalTime().Ticks.ToString().

  5. Читайте журнал изменений каждые 30 секунд (это период ожидания по умолчанию, определяемый константой WaitSeconds) или когда пользователь вводит r. При чтении журнала изменений консольное приложение выполняет следующие действия.

    1. Использует List.GetChanges для возврата объекта ChangeCollection, который представляет собой коллекцию изменений, внесенных в список после последней обработки изменений.

    2. Вызывает DisplayChanges для отображения изменений в объекте ChangeCollection.

    3. Устанавливает новую точку во времени для чтения из журнала изменений. При наличии изменений списка (который был возвращен в coll), задайте в параметре ChangeTokenStart дату и время последнего изменения.

Примечание.

Код, приведенный в этой статье, предоставляется "как есть" без какой-либо явной или подразумеваемой гарантии, включая подразумеваемые гарантии пригодности для какой-либо цели, для продажи или гарантии отсутствия нарушения прав иных правообладателей.

private static void DoWork()
        {
            Console.WriteLine();
            Console.WriteLine("Url: " + url);
            Console.WriteLine("User name: " + userName);
            Console.WriteLine("List name: " + listName);
            Console.WriteLine();
            try
            {

                Console.WriteLine(string.Format("Connecting to {0}", url));
                Console.WriteLine();
                ClientContext cc = new ClientContext(url);
                cc.AuthenticationMode = ClientAuthenticationMode.Default;
                cc.Credentials = new SharePointOnlineCredentials(userName, password);

                ListCollection lists = cc.Web.Lists;
                IEnumerable<List> results = cc.LoadQuery<List>(lists.Where(lst => lst.Title == listName));
                cc.ExecuteQuery();
                List list = results.FirstOrDefault();
                if (list == null)
                {

                    Console.WriteLine("A list named \"{0}\" does not exist. Press any key to exit...", listName);
                    Console.ReadKey();
                    return;
                }

                nextRunTime = DateTime.Now;

                ChangeQuery cq = new ChangeQuery(false, false);
                cq.Item = true;
                cq.DeleteObject = true;
                cq.Add = true;
                cq.Update = true;

                // Set the ChangeTokenStart to two days ago to reduce how much data is returned from the change log. Depending on your requirements, you might want to change this value. 
                // The value of the string assigned to ChangeTokenStart.StringValue is semicolon delimited, and takes the following parameters in the order listed:
                // Version number. 
                // The change scope (0 - Content Database, 1 - site collection, 2 - site, 3 - list).
                // GUID of the item the scope applies to (for example, GUID of the list). 
                // Time (in UTC) from when changes occurred.
                // Initialize the change item on the ChangeToken using a default value of -1.

                cq.ChangeTokenStart = new ChangeToken();
                cq.ChangeTokenStart.StringValue = string.Format("1;3;{0};{1};-1", list.Id.ToString(), DateTime.Now.AddDays(-2).ToUniversalTime().Ticks.ToString());

                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine(string.Format("Ctrl+c to exit. Press \"r\" key to force the console application to read the change log without waiting {0} seconds.", WaitSeconds));
                Console.WriteLine();
                Console.ResetColor();
                do
                {
                    do
                    {
                        if (Console.KeyAvailable &amp;&amp; Console.ReadKey(true).KeyChar == 'r') { break; }
                    }
                    while (nextRunTime > DateTime.Now);

                    Console.WriteLine(string.Format("Looking for items modified after {0} UTC", GetDateStringFromChangeToken(cq.ChangeTokenStart)));

                    
                    ChangeCollection coll = list.GetChanges(cq);
                    cc.Load(coll);
                    cc.ExecuteQuery();


                    DisplayChanges(coll, cq.ChangeTokenStart);
                    // If there are changes to the list (which was returned in coll), set ChangeTokenStart to the last change's date and time. This will be used as the starting point for the next read from the change log.                      
                    cq.ChangeTokenStart = coll.Count > 0 ? coll.Last().ChangeToken : cq.ChangeTokenStart;

                    nextRunTime = DateTime.Now.AddSeconds(WaitSeconds);

                } while (true);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Console.WriteLine("Press any key to exit...");
                Console.ReadKey();

            }
        }

См. также