Quelqu'un a-t-il déjà travaillé avec Sync Framework et la synchronisation via les points de terminaison WCF? Veuillez partager des exemples de code ou des exemples de projets. Je suis particulièrement à la recherche de scénarios hors ligne dans lesquels le client se connecte uniquement pour récupérer les mises à jour du serveur.Synchronisation des bases de données SQL Server 2008 via HTTP à l'aide de WCF & Sync Framework
23
A
Répondre
28
j'ai fait ce qui suit pour obtenir Sync Framework de travail en utilisant WCF avec SQL Server 2008
- Activé Suivi des modifications dans SQL Server 2008
- changement activé le suivi des tables participant à la synchronisation
- Ajout d'une méta-données table nommée ancre
- Ajout d'une table pour suivre les ID client nommés "guid"
- Utilisé SqlExpressClientSyncProvider disponible sur le site du projet codeplex de MSF en tant que Client Sync Prov Ider
Utilisé SqlSyncAdapterBuilder pour construire des adaptateurs pour les tables qui participent à la synchronisation
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); }
ancre Ajouté commandes
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;
Mis en œuvre un service WCF en utilisant une instance de DbServerSyncProvider fonctionnant en tant que fournisseur de synchronisation du serveur. Vous devrez générer des adaptateurs de synchronisation et définir la commande d'ancrage comme indiqué à l'étape précédente pour le fournisseur de serveur.
[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); }
créé une classe proxy mise en œuvre ServerSyncProvider pour accéder au service 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); } }
- Création d'une instance de SyncAgent et mis RemoteProvider avec une instance de la classe proxy qui est utilisé pour accéder au service WCF. LocalProvider est réglé par exemple de SqlExpressClientSyncProvider
- tables ont été ajoutées et les groupes de synchronisation à la configuration SyncAgent
- SyncAgent.Synchronize()
Merci monsieur, que nous avons assez utile. Incroyable à quel point il est simple de se synchroniser à distance en utilisant Sync Framework + WCF. Bon produit! –
Existe-t-il un moyen d'obtenir un exemple de code complet? – MetalLemon
Oui, un exemple de projet pour Sync Framework 2.1 serait génial! – Manni