c# .net sql-server-2008 microsoft-sync-framework

c# - Sincronización de bases de datos SQL Server 2008 a través de HTTP utilizando WCF y Sync Framework



.net sql-server-2008 (1)

Hice lo siguiente para que Sync Framework funcione usando WCF con SQL Server 2008

  • Habilitado el seguimiento de cambios en SQL Server 2008
  • Habilitado el seguimiento de cambios para las tablas que participan en la sincronización
  • Se agregó una tabla de metadatos llamada ancla
  • Se agregó una tabla para rastrear Ids de clientes con el nombre "guid"
  • SqlExpressClientSyncProvider utilizado disponible desde el sitio del proyecto codeplex de MSF como proveedor de sincronización de clientes
  • SqlSyncAdapterBuilder usado para construir adaptadores para tablas que participan en Sync

    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); }

  • Comandos de ancla agregados

    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;

  • Implementé un servicio WCF utilizando una instancia de DbServerSyncProvider que funciona como proveedor de sincronización de servidor. Deberá generar adaptadores de sincronización y establecer el comando de ancla como se muestra en el paso anterior para el proveedor de Servidor también.

    [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); }

  • Creó una clase proxy que implementa ServerSyncProvider para acceder al servicio 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); } }

  • Creó una instancia de SyncAgent y configuró RemoteProvider con una instancia de clase proxy que se utiliza para acceder al servicio WCF. LocalProvider se establece con instancia de SqlExpressClientSyncProvider
  • Se agregaron tablas y grupos de sincronización a la configuración de SyncAgent
  • SyncAgent.Synchronize ()

¿Alguien ha trabajado aquí con Sync Framework y sincronizándose a través de los puntos finales de WCF? Por favor comparta muestras de código o ejemplos de proyectos. Estoy buscando específicamente escenarios fuera de línea en los que el cliente solo se conecta para obtener actualizaciones del servidor.