Abfragen des SharePoint-Änderungsprotokolls mit ChangeQuery und ChangeToken
Verwenden Sie ChangeQuery und ChangeToken , um das SharePoint-Änderungsprotokoll nach Änderungen abzufragen, die an einer SharePoint-Inhaltsdatenbank, Websitesammlung, Website oder Liste vorgenommen wurden.
Gilt für: SharePoint 2013 | SharePoint-Add-Ins | SharePoint Online
Sie können das SharePoint-Änderungsprotokoll abfragen, indem Sie ChangeQuery und ChangeToken verwenden, um Änderungen an einer SharePoint-Inhaltsdatenbank, -Websitesammlung, -Website oder -Liste zu suchen und zu verarbeiten.
Das Codebeispiel Core.ListItemChangeMonitor verdeutlicht, wie Sie das Änderungsprotokoll von SharePoint verwenden können, um Änderungen an einer SharePoint-Liste zu suchen und zu verarbeiten. Verwenden Sie dieses Codebeispiel für folgende Aufgaben:
Überwachen von SharePoint auf Änderungen an einer Liste, Website, Websitesammlung oder Inhaltsdatenbank.
Starten Sie einen Geschäftsprozess, nachdem eine Änderung an einem Element in einer Liste vorgenommen wurde.
Vervollständigen Sie Ihren Remoteereignisempfänger. Mithilfe des Änderungsprotokollmusters mit einem Remote-Ereignisempfängermuster bietet eine zuverlässigere Architektur für die Behandlung aller Änderungen, die an SharePoint-Inhaltsdatenbanken, -Websitesammlungen, -Websites oder -Listen vorgenommen werden. Remote-Ereignisempfänger werden sofort ausgeführt, aber da sie auf einem Remoteserver ausgeführt werden, tritt möglicherweise ein Kommunikationsfehler auf. Das Änderungsprotokollmuster stellt sicher, dass alle Änderungen für die Verarbeitung verfügbar sind, die Anwendung, die die Änderungen verarbeitet, wird jedoch in der Regel anhand eines Zeitplans ausgeführt (z. B. ein Zeitgeberauftrag). Dies bedeutet, dass Änderungen nicht sofort verarbeitet werden. Wenn Sie diese beiden Muster gemeinsam verwenden, stellen Sie sicher, dass Sie einen Mechanismus verwenden, durch den verhindert wird, dass dieselbe Änderung zweimal verarbeitet wird. Weitere Informationen finden Sie unter Verwenden von Remoteereignisempfängern in SharePoint.
Bevor Sie beginnen
Laden Sie zunächst das Beispiel-Add-In Core.ListItemChangeMonitor aus dem Projekt Office 365-Entwicklermuster und -vorgehensweisen auf GitHub herunter.
Bevor Sie dieses Codebeispiel ausführen, führen Sie folgende Schritte aus:
Melden Sie sich bei Ihrer Office 365-Website an, auf der die Liste erstellt werden soll.
Wählen Sie Websiteinhalte.
Wählen Sie Add-In hinzufügen aus.
Wählen Sie Benutzerdefinierte Liste aus.
Geben Sie unter Name den Namen TestList ein.
Wählen Sie Erstellen aus.
Zum Anzeigen einer Demo von diesem Codebeispiel führen Sie die folgenden Schritte aus:
Wählen Sie Start in Visual Studio aus.
Geben Sie die URL Ihrer Office 365-Website, den Namen der Liste (TestList) sowie Ihre Office 365-Anmeldeinformationen ein. Die Konsolenanwendung wartet jetzt, bis Änderungen an TestList vorgenommen werden. Die Konsolenanwendung überprüft standardmäßig das Änderungsprotokoll und aktualisiert die Anzeige alle 30 Sekunden.
Hinzufügen eines neuen Elements zu TestList:
Öffnen Sie Ihre Office 365 Website, und wechseln Sie zu Websiteinhalte>TestList.
Wählen Sie Neues Element aus.
Geben Sie MyTitle in Titel ein, und wählen Sie dann Speichern aus.
Stellen Sie sicher, dass Ihre Änderung in der Konsolenanwendung angezeigt wird. Sie können erzwingen, dass die Konsolenanwendung das Änderungsprotokoll von SharePoint liest, indem Sie r in die Konsolenanwendung eingeben.
Verwenden des Add-Ins "Core.ListItemChangeMonitor"
In Program.cs ruft MainDoWork auf, um das Änderungsprotokoll von SharePoint zu lesen und zu verarbeiten:
Erstellen Sie ein ChangeQuery-Objekt , um auf das Änderungsprotokoll von SharePoint zuzugreifen.
Verwenden Sie das Änderungsprotokoll, um Änderungen an Elementen mithilfe von cq.Item = true zurückzugeben. Die Änderungen umfassen:
Neue Elemente, die mithilfe von cq.Add= true hinzugefügt wurden.
Gelöschte Elemente mithilfe von cq. DeleteObject = true.
Elemente, die mithilfe von cq.Update=true geändert wurden.
Erstellen Sie ein ChangeToken-Objekt, um Änderungen aus dem Änderungsprotokoll von einem bestimmten Zeitpunkt zu lesen.
Legen Sie ChangeToken.StringValue auf die Versionsnummer, den Änderungsumfang, die GUID von TestList, Datum und Uhrzeit von Änderungen und den Wert des Änderungselements im ChangeToken fest (Initialisierung mit einem Wert von -1). In diesem Codebeispiel wird die Anzahl von Änderungen, die aus dem Änderungsprotokoll gelesen werden, durch Initialisieren von Datum und Uhrzeit der Änderungen auf die vorherigen beiden Tage durch Verwendung von DateTime.Now.AddDays(-2).ToUniversalTime().Ticks.ToString() begrenzt.
Lesen das Änderungsprotokoll entweder alle 30 Sekunden (dies ist die standardmäßige Wartezeit, die von der Konstante WaitSeconds festgelegt wird), oder wenn der Benutzer r eingibt. Beim Lesen des Änderungsprotokolls führt die Konsolenanwendung die folgenden Schritte aus:
Verwendet List.GetChanges, um die ChangeCollection zurückzugeben, d. h. eine Sammlung von Änderungen an der Liste seit der letzten Verarbeitung von Änderungen.
Aufrufen von DisplayChanges, um die Änderungen im ChangeCollection-Objekt anzuzeigen.
Legt den neuen Zeitpunkt zum Lesen von Änderungen aus dem Änderungsprotokoll fest. Wenn Änderungen an der Liste vorhanden sind (die in coll zurückgegeben wurde), legen Sie ChangeTokenStart auf das Datum und die Uhrzeit der letzten Änderung fest.
Hinweis
Der Code in diesem Artikel wird wie besehen und ohne jegliche Garantie zur Verfügung gestellt, gleich ob ausdrücklich oder konkludent, einschließlich jedweder stillschweigenden Gewährleistung der Eignung für einen bestimmten Zweck, Marktgängigkeit oder Nichtverletzung von Rechten.
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 && 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();
}
}