Класс SPChangeTokenCollection
Представляет коллекцию объектов SPChangeToken .
Иерархия наследования
System.Object
Microsoft.SharePoint.Administration.SPAutoSerializingObject
Microsoft.SharePoint.SPBaseCollection
Microsoft.SharePoint.SPChangeTokenCollection
Пространство имен: Microsoft.SharePoint
Сборка: Microsoft.SharePoint (в Microsoft.SharePoint.dll)
Синтаксис
'Декларация
Public NotInheritable Class SPChangeTokenCollection _
Inherits SPBaseCollection
'Применение
Dim instance As SPChangeTokenCollection
public sealed class SPChangeTokenCollection : SPBaseCollection
Замечания
Эта коллекция предоставляется таким образом, можно с легкостью управлять журналами изменения на уровне веб-приложения. Все базы данных содержимого в веб-приложении ведет свой журнал изменений. Если требуется изменение консолидированного отчета для нескольких баз данных содержимого, можно использовать объект SPChangeTokenCollection для хранения маркеров изменений для всех баз данных в одну коллекцию. После получения коллекции маркеров изменения можно перечислить коллекцию и запрашивать каждой базы данных в свою очередь его изменения, вызвав метод GetChanges(SPChangeToken) . Можно сериализовать коллекцию с помощью метода ToString() и сохранить его на диске. Позже при посещении журнал изменений можно реконструировать в коллекцию, используя вариант конструктор, который принимает строковый аргумент и воспользуйтесь десериализованный изменение коллекции маркеров для запроса изменения снова входит.
Примеры
Следующий пример является консольным приложением, которое запрашивает журнал изменений для каждой базы данных контента в веб-приложении. При первом запуске программы все изменения извлекаются из каждого журнала. После обработки в каждом наборе изменений, программа сохраняет последний маркер изменений в изменить коллекцию в коллекцию SPChangeTokenCollection . При обработке всех журналов сериализованного объекта SPChangeTokenCollection , и полученная строка хранится в файле на диске.
При последующих запусках программы чтения файла данных, извлекается строковое представление коллекции и реконструкции объекта SPChangeTokenCollection . Изменение маркеров в коллекции, используются для выборки изменений, внесенных с момента последнего выполнения программы.
В этом примере не предпринимает попытку сохранить сведения, он извлекает из журнала изменений. Он просто выводит выходные данные на консоль. Полезные расширения будет добавление кода для объединения изменений в файле или базе данных, где они могут подвергаться для дальнейшего анализа.
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
Потокобезопасность
Любые общедоступные элементы static (Shared в Visual Basic) этого типа являются потокобезопасными. Не гарантируется, что любые элементы экземпляров потокобезопасны.
См. также
Справочные материалы
Элементы SPChangeTokenCollection