Share via


Procédure : enregistrer et restaurer un jeton de modification

Dernière modification : mardi 28 juillet 2009

S’applique à : SharePoint Foundation 2010

Si votre application interroge le journal des modifications à un intervalle régulier, vous pouvez le cas échéant persister le dernier jeton de modification à la fin d'une exécution, et reconstruire ultérieurement le jeton persisté à utiliser en tant que point de départ pour la prochaine exécution. Pour enregistrer un jeton de modification, appelez d'abord la méthode SPChangeToken.ToString() pour obtenir une représentation de chaîne du jeton ; puis, persistez le résultat vers un stockage persistant. Pour restaurer le jeton, récupérez la chaîne stockée et passez-la au constructeur SPChangeToken.SPChangeToken(String).

Note AttentionAttention

Les jetons de modification sont spécifiques à une liste, un site Web, une collection de sites ou une base de données de contenu. L'objet SPChangeToken d'un objet ne peut pas être utilisé dans la méthode GetChanges d'un autre objet. La seule exception à cette règle étant qu'un objet SPChangeToken d'un objet SPContentDatabase ne peut être utilisée dans la méthode GetChanges pour aucun objet contenu dans cette base de données de contenu.

Exemple

L'exemple suivant est une application console qui interroge le journal des modifications qui ont une délimitation de base de données de contenu.

La première fois que l'application s'exécute, la requête récupère toutes les modifications enregistrées de puis le début du journal jusqu'à sa fin actuelle. Cette requête est effectuée d'abord en définissant la propriété ChangeTokenStart d'un objet SPChangeQuery à une valeur nulle, puis en passant l'objet SPQuery à la méthode GetChanges. Une fois que toutes les modifications ont été traitées, le programme sérialise le dernier jeton de modification du dernier lot de modifications en appelant la méthode ToString() et stocke le résultat dans un fichier sur disque.

Lors des exécutions suivantes, le programme désérialise le jeton de modification stocké et l'utilise pour définir la propriété ChangeTokenStart, qui définit le point de départ de sa requête portant sur le journal des modifications. La propriété ChangeTokenEnd est laissée à sa valeur nulle par défaut, ce qui indique que la requête doit continuer jusqu'à la fin du journal.

L'essentiel du travail est fait dans la fonction GetStartingToken, où le constructeur SPChangeToken est appelé.

using System;
using System.IO;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;

namespace Test
{
   class ConsoleApp
   {
      private const string DATA_FILE_PATH = "ChangeToken.dat";

      static void Main(string[] args)
      {
         using (SPSite site = new SPSite("https://localhost"))
         {
            SPChangeQuery query = new SPChangeQuery(true, true);
            query.ChangeTokenStart = GetStartingToken();

            while (true)
            {
               // Get a batch of changes.
               SPChangeCollection changes = site.ContentDatabase.GetChanges(query);

               // Process them.
               foreach (SPChange change in changes)
               {
                  Console.WriteLine("Date: {0}  Type of object: {1}  Type of change: {2}",
                     change.Time.ToShortDateString(), change.GetType().ToString(), change.ChangeType);
               }

               // Starting point for next batch.
               query.ChangeTokenStart = changes.LastChangeToken;

               // If this is the last batch, exit.
               if (changes.Count < query.FetchLimit)
                  break;
            }
            // Serialize the last token as a starting point for the next run.
            SaveLastToken(query.ChangeTokenStart);
         }

         Console.Write("\nPress ENTER to continue...");
         Console.ReadLine();
      }

      static SPChangeToken GetStartingToken()
      {
         // Passing a null token to GetChanges fetches 
         // changes from the start of the log.
         SPChangeToken token = null;

         // If we have a token from the last run, use it.
         if (File.Exists(DATA_FILE_PATH))
         {
            using (FileStream fs = File.OpenRead(DATA_FILE_PATH))
            {
               BinaryReader br = new BinaryReader(fs);
               try
               {
                  string str = br.ReadString();
                  // Construct a change token from serialized string.
                  token = new SPChangeToken(str);
               }
               catch (EndOfStreamException e)
               {
                  // No serialized string, so do nothing.
               }
               finally
               {
                  br.Close();
               }
            }
         }
         return token;
      }

      static void SaveLastToken(SPChangeToken token)
      {
         using (FileStream fs = File.Create(DATA_FILE_PATH))
         {
            // Serialize the token.
            BinaryWriter bw = new BinaryWriter(fs);
            string s = token.ToString();
            bw.Write(s);

            // Flush and close.
            bw.Flush();
            bw.Close();
         }
      }
   }
}
Imports System
Imports System.IO
Imports Microsoft.SharePoint
Imports Microsoft.SharePoint.Administration

Module ConsoleApp

   Private Const DATA_FILE_PATH As String = "ChangeToken.dat"

   Sub Main()
      Using site As SPSite = New SPSite("https://localhost")

         Dim query As New SPChangeQuery(True, True)
         query.ChangeTokenStart = GetStartingToken()

         While (True)
            ' Get a batch of changes.
            Dim changes As SPChangeCollection = site.ContentDatabase.GetChanges(query)

            ' Process them.
            For Each change As SPChange In changes
               Console.WriteLine("Date: {0}  Type of object: {1}  Type of change: {2}", _
                     change.Time.ToShortDateString(), change.GetType().ToString(), change.ChangeType)
            Next

            ' This is the starting point for next batch.
            query.ChangeTokenStart = changes.LastChangeToken

            ' If this is the last batch, exit.
            If changes.Count < query.FetchLimit Then
               Exit While
            End If

         End While

         ' Serialize the last token as a starting point for the next run.
         SaveLastToken(query.ChangeTokenStart)
      End Using

      Console.Write(vbCrLf + "Press ENTER to continue...")
      Console.ReadLine()

   End Sub

   Function GetStartingToken() As SPChangeToken
      ' Passing a null token to GetChanges fetches 
      ' changes from the start of the log.
      Dim token As SPChangeToken = Nothing

      ' If we have a token from the last run, use it.
      If File.Exists(DATA_FILE_PATH) Then
         Using fs As FileStream = File.OpenRead(DATA_FILE_PATH)
            Dim br As BinaryReader = New BinaryReader(fs)
            Try
               Dim str As String = br.ReadString()
               ' Construct a change token from serialized string.
               token = New SPChangeToken(str)
            Catch e As EndOfStreamException
               ' No serialized string, so do nothing.
            Finally
               br.Close()
            End Try
         End Using
      End If

      Return token
   End Function

   Sub SaveLastToken(ByRef token As SPChangeToken)
      Using fs As FileStream = File.Create(DATA_FILE_PATH)
         ' Serialize the token.
         Dim bw As BinaryWriter = New BinaryWriter(fs)
         Dim s As String = token.ToString()
         bw.Write(s)
         ' Flush and close.
         bw.Flush()
         bw.Close()
      End Using
   End Sub

End Module

Voir aussi

Référence

SPChangeToken

SPChangeTokenCollection