Синхронизация баз данных 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()
Другие вопросы по тегам