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.