Compartir a través de


Consultar el registro de cambios de SharePoint con ChangeQuery y ChangeToken

Use ChangeQuery y ChangeToken para consultar en el registro de cambios de SharePoint los cambios realizados en una base de datos de contenido de SharePoint, una colección de sitios, un sitio o una lista.

Se aplica a: SharePoint 2013 | Complementos de SharePoint | SharePoint Online

Puede consultar el registro de cambios de SharePoint usando ChangeQuery y ChangeToken para buscar y procesar los cambios realizados en una base de datos de contenido, una colección de sitios, un sitio o una lista de SharePoint.

El código de ejemplo Core.ListItemChangeMonitor muestra cómo usar el registro de cambios de SharePoint para buscar y procesar los cambios realizados en una lista de SharePoint. Use este ejemplo de código para:

  • Supervisar SharePoint para ver los cambios en una lista, un sitio, una colección de sitios o una base de datos de contenido.

  • Iniciar un proceso empresarial después de que se produzca un cambio en un elemento de una lista.

  • Complementar el receptor de eventos remoto. Cuando se usa el patrón de registro de cambios con un patrón de receptor de eventos remotos, se obtiene una arquitectura más confiable para controlar todos los cambios realizados en las bases de datos de contenido, las colecciones de sitios, los sitios o las listas de SharePoint. Los receptores de eventos remotos se ejecutan inmediatamente pero, como lo hacen en un servidor remoto, se podría producir un error de comunicación. El patrón de registro de cambios garantiza que todos los cambios van a estar disponibles para su procesamiento, pero la aplicación encargada de procesarlos suele ejecutarse según una programación (por ejemplo, un trabajo del temporizador). Esto significa que los cambios no se procesan de inmediato. Si usa ambos patrones conjuntamente, procure usar un mecanismo que evite que el mismo cambio se procese dos veces. Para obtener más información, vea Usar receptores de eventos remotos en SharePoint.

Antes de empezar

Para empezar, descargue el complemento de ejemplo Core.ListItemChangeMonitor desde el proyecto Modelos y prácticas de desarrollo de Office 365 en GitHub.

Haga lo siguiente antes de ejecutar este código de ejemplo:

  1. Inicie sesión en el sitio de Office 365 donde quiera crear la lista.

  2. Elija Contenidos del sitio.

  3. Elija Agregar un complemento.

  4. Elija Lista personalizada.

  5. En Nombre, escriba /testlist.

  6. Elija Crear.

Para ver una demostración de este ejemplo de código, siga estos pasos:

  1. Elija Iniciar en Visual Studio.

  2. Escriba la dirección URL del sitio de Office 365, el nombre de la lista (TestList) y sus credenciales de Office 365. La aplicación de consola esperará a que se efectúen los cambios que corresponda en /testlist. La aplicación de consola consulta el registro de cambios y actualiza la pantalla cada 30 segundos de forma predeterminada.

  3. Agregue un elemento nuevo a /testlist:

    1. Abra el sitio Office 365 y vaya aSite Contents TestList(Lista de pruebasde contenido> del sitio).

    2. Elija Elemento nuevo.

    3. Escriba MyTitle en Título y, luego, seleccione Guardar.

  4. Compruebe que el cambio aparece en la aplicación de consola. Para forzar a la aplicación de consola a leer el registro de cambios de SharePoint, escriba r en la aplicación de consola.

Usar el complemento Core.ListItemChangeMonitor

En Program.cs, Main llama a DoWork para leer y procesar el registro de cambios de SharePoint:

  1. Cree un objeto ChangeQuery para acceder al registro de cambios de SharePoint.

  2. Use el registro de cambios para devolver los cambios ocurridos en los elementos; para ello, use cq.item = true. Los cambios engloban lo siguiente:

    • Nuevos elementos agregados con cq.Add= true.

    • Elementos eliminados mediante cq. DeleteObject = true.

    • Elementos modificados con cq.Update=true.

  3. Cree un objeto ChangeToken para leer los cambios del registro de cambios a partir de un determinado momento.

  4. Configure ChangeToken.StringValue con el número de versión, el ámbito de cambios, el GUID de TestList, la fecha y hora en que se produjeron los cambios y el valor del elemento de cambio de ChangeToken (inicializar con un valor de -1). En este código de ejemplo, la cantidad de cambios de lectura del registro de cambios se limita inicializando la fecha y hora en que se produjeron los cambios a los dos últimos días; para ello, se usa DateTime.Now.AddDays(-2).ToUniversalTime().Ticks.ToString().

  5. Lea el registro de cambios cada 30 segundos (se trata del período de espera predeterminado establecido por la constante WaitSeconds) o cuando el usuario escriba r. Al leer el registro de cambios, la aplicación de consola hace lo siguiente:

    1. Usa List.GetChanges para devolver ChangeCollection, que es un conjunto de los cambios realizados en la lista desde la última vez que se procesaron cambios.

    2. Llama a DisplayChanges para mostrar los cambios en el objeto ChangeCollection.

    3. Establece el nuevo punto de referencia en el tiempo para leer los cambios del registro de cambios. Si hay cambios en la lista (devueltos en coll), establezca ChangeTokenStart en la fecha y hora del último cambio.

Nota:

El código de este artículo se proporciona tal cual, sin garantía de ningún tipo, expresa o implícita, incluidas las garantías implícitas de aptitud para un propósito particular, comerciabilidad o ausencia de infracción.

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

            }
        }

Vea también