SPChangeTokenCollection-Klasse
Stellt eine Auflistung von SPChangeToken -Objekten dar.
Vererbungshierarchie
System.Object
Microsoft.SharePoint.Administration.SPAutoSerializingObject
Microsoft.SharePoint.SPBaseCollection
Microsoft.SharePoint.SPChangeTokenCollection
Namespace: Microsoft.SharePoint
Assembly: Microsoft.SharePoint (in Microsoft.SharePoint.dll)
Syntax
'Declaration
Public NotInheritable Class SPChangeTokenCollection _
Inherits SPBaseCollection
'Usage
Dim instance As SPChangeTokenCollection
public sealed class SPChangeTokenCollection : SPBaseCollection
Hinweise
Diese Auflistung wird bereitgestellt, sodass Sie problemlos Änderungsprotokolle auf der Webanwendungsebene verwalten können. Jede Inhaltsdatenbank in eine Webanwendung verwaltet ein eigenes Änderungsprotokoll. Sie ggf. einen konsolidierten Bericht für mehrere Inhaltsdatenbanken können Sie ein SPChangeTokenCollection -Objekt, zum Speichern der Änderung-Token für alle Datenbanken in einer einzelnen Auflistung. Haben Sie eine Auflistung von Token ändern, können Sie die Auflistung und jede Datenbank wiederum für seine Änderungen durch Aufrufen der GetChanges(SPChangeToken) -Methode bitten. Sie können auch mit der ToString() -Methode eine Auflistung serialisieren und auf einem Datenträger zu speichern. Wenn Sie Änderungsprotokolle überarbeiten möchten, können Sie später rekonstruieren die Auflistung unter Verwendung des Konstruktors, die einen Zeichenfolgenargument akzeptiert einer Variation und verwenden dann der Tokenauflistung der deserialisierten Änderung Abfrage die Änderung erneut anmeldet.
Beispiele
Im folgende Beispiel ist eine Konsolenanwendung, die das Änderungsprotokoll für jede Inhaltsdatenbank in eine Webanwendung abfragt. Alle Änderungen werden bei der ersten Ausführung des Programms aus jedem Protokoll abgerufen. Nach der Verarbeitung jeder Auflistung der Änderungen an, speichert das Programm das letzte Änderungstoken in der Auflistung ändern, eine SPChangeTokenCollection -Auflistung. Wenn alle Protokolle verarbeitet wurden, wird das SPChangeTokenCollection -Objekt serialisiert und die daraus resultierende Zeichenfolge wird in einer Datei auf der Festplatte gespeichert.
Bei nachfolgenden Ausführungen des Programms Lesen der Datendatei und das SPChangeTokenCollection -Objekt wird neu erstellt, wird die Zeichenfolgendarstellung der Auflistung abgerufen. Die Änderung Token in der Auflistung werden dann zum Abrufen der Änderungen seit der letzten Ausführung des Programms verwendet.
In diesem Beispiel unternimmt keinen Versuch, die Informationen zu speichern, die es von Änderungsprotokolle abruft. Es gibt einfach die Ausgabe an die Konsole aus. Eine nützliche Verbesserung wäre, fügen Sie Code für die Konsolidierung von Änderungen in einer Datei oder Datenbank, wo könnten sie zur weiteren Analyse zu unterziehen.
using System;
using System.IO;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;
namespace Test
{
class ConsoleApp
{
private const string DATA_FILE_PATH = "ChangeTokens.dat";
static void Main(string[] args)
{
// Get a collection of content databases
SPWebApplication wa = SPWebApplication.Lookup(new Uri("https://localhost"));
SPContentDatabaseCollection dbs = wa.ContentDatabases;
// Get a collection of change tokens
SPChangeTokenCollection tokens = GetTokens();
// Process the changes for each database
foreach (SPContentDatabase db in dbs)
{
// Get an Id for the current database
SPPersistedObject o = db as SPPersistedObject;
Guid id = o.Id;
Console.WriteLine("\nContent database ID = {0}", id.ToString());
// Create a query.
SPChangeQuery query = new SPChangeQuery(true, true);
/* Get the starting token.
* Note that if the token is not
* found, the indexer returns null.
* Passing a null token fetches changes
* from the beginning of the log.
*/
query.ChangeTokenStart = tokens[id];
while (true)
{
// Get a batch of changes
SPChangeCollection changes = db.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);
}
// If this is the last batch, exit
if (changes.Count < query.FetchLimit)
{
// Save the last token as a starting point for the next run
tokens.Add(changes.LastChangeToken, true);
break;
}
else
{
// Starting point for next batch
query.ChangeTokenStart = changes.LastChangeToken;
}
}
}
// Persist the token collection
SaveTokens(tokens);
Console.Write("\nPress ENTER to continue...");
Console.ReadLine();
}
static SPChangeTokenCollection GetTokens()
{
SPChangeTokenCollection tokens = new SPChangeTokenCollection();
// If we have tokens from the last run, use them
if (File.Exists(DATA_FILE_PATH))
{
using (FileStream fs = File.OpenRead(DATA_FILE_PATH))
{
BinaryReader br = new BinaryReader(fs);
try
{
string s = br.ReadString();
// Construct a change token from string
tokens = new SPChangeTokenCollection(s);
}
catch (EndOfStreamException e)
{
// No serialized string, so do nothing
}
finally
{
br.Close();
}
}
}
return tokens;
}
static void SaveTokens(SPChangeTokenCollection tokens)
{
using (FileStream fs = File.Create(DATA_FILE_PATH))
{
// Serialize the tokens
BinaryWriter bw = new BinaryWriter(fs);
string s = tokens.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 = "ChangeTokens.dat"
Sub Main()
' Get a collection of content databases
Dim wa As SPWebApplication = SPWebApplication.Lookup(New Uri("https://localhost"))
Dim dbs As SPContentDatabaseCollection = wa.ContentDatabases
' Get a collection of change tokens
Dim tokens As SPChangeTokenCollection = GetTokens()
' Process the changes for each database
Dim db As SPContentDatabase
For Each db In dbs
' Get an Id for the current database
Dim o As SPPersistedObject = CType(db, SPPersistedObject)
Dim id As Guid = o.Id
Console.WriteLine(vbCrLf + "Content database ID = {0}", id.ToString())
' Create a query
Dim query As New SPChangeQuery(True, True)
' Get the starting token.
' Note that if the token is not
' found, the indexer returns a null value.
' Passing a null token fetches changes
' from the beginning of the log.
query.ChangeTokenStart = tokens(id)
While (True)
' Get a batch of changes
Dim changes As SPChangeCollection = db.GetChanges(query)
' Process them
Dim change As SPChange
For Each change In changes
Console.WriteLine("Date: {0} Type of object: {1} Type of change: {2}", _
change.Time.ToShortDateString(), change.GetType().ToString(), change.ChangeType)
Next change
' If this is the last batch, exit
If changes.Count < query.FetchLimit Then
' Save the last token as a starting point for the next run
tokens.Add(changes.LastChangeToken, True)
Exit While
Else
' Starting point for next batch
query.ChangeTokenStart = changes.LastChangeToken
End If
End While
Next db
'Persist the token collection
SaveTokens(tokens)
Console.Write(vbCrLf + "Press ENTER to continue...")
Console.ReadLine()
End Sub
Function GetTokens() As SPChangeTokenCollection
Dim tokens As SPChangeTokenCollection = New SPChangeTokenCollection()
' If we have tokens from the last run, use them
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 s As String = br.ReadString()
' Construct a change token from string
tokens = New SPChangeTokenCollection(s)
Catch e As EndOfStreamException
' No serialized string, so do nothing
Finally
br.Close()
End Try
End Using
End If
Return tokens
End Function
Sub SaveTokens(ByRef tokens As SPChangeTokenCollection)
Using fs As FileStream = File.Create(DATA_FILE_PATH)
' Serialize the tokens
Dim bw As BinaryWriter = New BinaryWriter(fs)
Dim s As String = tokens.ToString()
bw.Write(s)
' flush and close
bw.Flush()
bw.Close()
End Using
End Sub
End Module
Threadsicherheit
Alle öffentlichen static (Shared in Visual Basic) Member dieses Typs sind threadsicher. Die Threadsicherheit von Instanzmembern ist nicht gewährleistet.
Siehe auch
Referenz
SPChangeTokenCollection-Member