Partilhar via


Consultar o log de alterações do SharePoint com ChangeQuery e ChangeToken

Use ChangeQuery e ChangeToken para consultar o log de alterações do SharePoint para obter alterações feitas em um banco de dados de conteúdo do SharePoint, coleção de sites, site ou lista.

Aplicável a: suplementos do SharePoint | SharePoint 2013 | SharePoint Online

Você pode consultar o log de alterações do SharePoint usando ChangeQuery e ChangeToken para localizar e processar alterações feitas em um banco de dados de conteúdo, um conjunto de sites, um site ou uma lista do SharePoint.

O exemplo de código Core.ListItemChangeMonitor mostra como usar o log de alterações do SharePoint para buscar e processar alterações feitas em uma lista do SharePoint. Use este exemplo de código para:

  • Monitorar alterações no SharePoint em uma lista, um site, um conjunto de sites ou um banco de dados de conteúdo.

  • Iniciar um processo de negócios depois que uma alteração for feita em um item em uma lista.

  • Complementar seu receptor de eventos remoto. Usar o padrão de log de alteração com um receptor de eventos remoto proporciona uma arquitetura mais confiável para lidar com todas as alterações feitas nos bancos de dados de conteúdo, conjuntos de sites, sites ou listas do SharePoint. Os receptores de eventos remotos são executados imediatamente, mas como funcionam em um servidor remoto, pode haver falha na comunicação. O padrão de log de alteração garante que todas as alterações fiquem disponíveis para processamento, mas o aplicativo que processa as alterações geralmente é executado de acordo com uma programação (por exemplo, um trabalho de timer). Isso significa que as alterações não são processadas imediatamente. Se usar esses dois padrões juntos, você garante que estará usando um mecanismo para impedir o processamento da mesma alteração duas vezes. Para saber mais, confira Usar receptores de eventos remotos no SharePoint.

Antes de começar

Para começar, faça o download do suplemento de exemplo Core.ListItemChangeMonitor no projeto Padrões e práticas do Desenvolvedor do Office 365 no GitHub.

Antes de executar este exemplo de código, faça o seguinte:

  1. Entre no site do Office 365 onde deseja criar a lista.

  2. Escolha Conteúdo do Site.

  3. Escolha adicionar um suplemento.

  4. Escolha Lista Personalizada.

  5. Em Nome, digite ListaTeste.

  6. Escolha Criar.

Para ver uma demonstração deste exemplo de código, execute as seguintes etapas:

  1. Escolha Iniciar no Visual Studio.

  2. Insira a URL de seu site do Office 365, o nome da lista (ListaTeste) e suas credenciais do Office 365. O aplicativo de console agora aguarda por alterações feitas em ListaTeste. Por padrão, o aplicativo de console verifica o log de alterações e atualiza a exibição a cada 30 segundos.

  3. Adicione um novo item à ListaTeste:

    1. Abra seu site Office 365 e vá para aLista de Testes de Conteúdo do> Site.

    2. Escolha novo item.

    3. Digite MeuTítulo em Título e escolha Salvar.

  4. Verifique se a alteração é exibida no aplicativo de console. Você pode forçar o aplicativo de console a ler o log de alterações do SharePoint inserindo r no aplicativo de console.

Usar o suplemento Core.ListItemChangeMonitor

Em Program.cs, Main chama DoWork para ler e processar o log de alterações do SharePoint:

  1. Crie um objeto ChangeQuery para acessar o log de alterações do SharePoint.

  2. Use o log de alteração para recuperar alterações a itens usando cq.Item = true. As alterações incluem:

    • Novos itens adicionados usando cq.Add= true.

    • Itens excluídos usando cq. DeleteObject = true.

    • Itens alterados usando cq.Update=true.

  3. Crie um objeto ChangeToken para ler as alterações do log de alterações a partir de determinado período de tempo.

  4. Defina ChangeToken.StringValue com o número de versão, escopo de alteração, GUID da ListaTeste, data e hora em que as alterações ocorreram e o valor do item alterado em ChangeToken (comece com um valor -1). Este exemplo de código limita a quantidade de alterações lidas do log iniciando pela data e hora, há dois dias, em que as alterações ocorreram, usando DateTime.Now.AddDays(-2).ToUniversalTime().Ticks.ToString().

  5. Leia o log de alterações a cada 30 segundos (o tempo de espera padrão definido pela constante WaitSeconds), ou digite r. Ao ler o log de alterações, o aplicativo de console executa as seguintes etapas:

    1. Usa List.GetChanges para retornar ChangeCollection, que é um conjunto de alterações feitas na lista desde que as últimas alterações foram processadas.

    2. Chama DisplayChanges para exibir as alterações no objeto ChangeCollection.

    3. Define o novo ponto no tempo para ler as alterações no log de alterações. Se houver alterações na lista (o que aparece em coll), defina ChangeTokenStart com a data e a hora da última alteração.

Observação

The code in this article is provided as-is, without warranty of any kind, either express or implied, including any implied warranties of fitness for a particular purpose, merchantability, or non-infringement.

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();

            }
        }

Confira também