Синхронизация баз данных SQL Server 2008 по HTTP с использованием WCF и Sync Framework
Кто-нибудь здесь работал с Sync Framework и синхронизацией через конечные точки WCF? Пожалуйста, поделитесь примерами кода или примерами проектов. Я специально ищу офлайн-сценарии, в которых клиент подключается только для получения обновлений с Сервера.
1 ответ
Я сделал следующее, чтобы заставить Sync Framework работать с использованием WCF с SQL Server 2008
- Включено отслеживание изменений в SQL Server 2008
- Включено отслеживание изменений для таблиц, участвующих в синхронизации
- Добавлена таблица метаданных с именем anchor
- Добавлена таблица для отслеживания идентификаторов клиентов с именем "guid"
- Использовал SqlExpressClientSyncProvider, доступный на сайте проекта MSF codeplex, в качестве поставщика синхронизации клиента
Использовал SqlSyncAdapterBuilder для создания адаптеров для таблиц, участвующих в синхронизации
foreach (var item in anchorTables) { // Use adapter builder to generate T-SQL for querying change tracking data and CRUD SqlSyncAdapterBuilder builder = new SqlSyncAdapterBuilder(); builder.Connection = new SqlConnection(this.connectionStringFactory.ConnectionString); builder.ChangeTrackingType = ChangeTrackingType.SqlServerChangeTracking; builder.SyncDirection = SyncDirection.Bidirectional; builder.TableName = item.TableName; // Get sync adapters from builder SyncAdapter clientAdapter = builder.ToSyncAdapter(); clientAdapter.TableName = item.TableName; this.clientSyncProvider.SyncAdapters.Add(clientAdapter); }
Добавлены якорные команды
SqlCommand anchroCommand = new SqlCommand { CommandText = "SELECT @" + SyncSession.SyncNewReceivedAnchor + " = change_tracking_current_version()" }; anchroCommand.Parameters.Add("@" + SyncSession.SyncNewReceivedAnchor, SqlDbType.BigInt) .Direction = ParameterDirection.Output; this.clientSyncProvider.SelectNewAnchorCommand = anchroCommand;
Реализована служба WCF с использованием экземпляра DbServerSyncProvider, выполняющего функции поставщика синхронизации сервера. Вам нужно будет сгенерировать адаптеры синхронизации и установить команду привязки, как показано на предыдущем шаге и для провайдера сервера.
[ServiceContract] public interface ISyncService { [OperationContract] SyncContext ApplyChanges(SyncGroupMetadata groupMetadata, DataSet dataSet, SyncSession syncSession); [OperationContract] SyncContext GetChanges(SyncGroupMetadata groupMetadata, SyncSession syncSession); [OperationContract] SyncSchema GetSchema(Collection<string> tableNames, SyncSession syncSession); [OperationContract] SyncServerInfo GetServerInfo(SyncSession syncSession); }
Создан прокси-класс, реализующий ServerSyncProvider для доступа к службе WCF.
public class DbServerSyncProviderProxy : ServerSyncProvider { SyncServiceProxy.SyncServiceClient serviceProxy = new SyncServiceProxy.SyncServiceClient(); public override SyncContext ApplyChanges(SyncGroupMetadata groupMetadata, DataSet dataSet, SyncSession syncSession) { return serviceProxy.ApplyChanges(groupMetadata, dataSet, syncSession); } }
- Создан экземпляр SyncAgent и задан RemoteProvider с экземпляром прокси-класса, который используется для доступа к службе WCF. LocalProvider устанавливается с экземпляром SqlExpressClientSyncProvider
- Добавлены таблицы и группы синхронизации в конфигурацию SyncAgent
- SyncAgent.Synchronize()