使用WCF和Sync Framework通过HTTP同步SQL Server 2008数据库

有没有人在这里使用Sync Framework并通过WCF端点进行同步? 请分享代码示例或示例项目。 我特意寻找离线场景,其中客户端仅在线从服务器获取更新。

我做了以下工作以使Sync Framework使用WCF与SQL Server 2008一起工作

  • 在SQL Server 2008中启用了更改跟踪
  • 为参与同步的表启用更改跟踪
  • 添加了名为anchor的元数据表
  • 添加了一个表来跟踪名为“guid”的客户端ID
  • 使用MSF的codeplex项目站点提供的SqlExpressClientSyncProvider作为Client Sync Provider
  • 使用SqlSyncAdapterBuilder为参与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); } 
  • 添加了锚点命令

     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; 
  • 使用充当服务器同步提供程序的DbServerSyncProvider实例实现WCF服务。 您将生成同步适配器并设置锚命令,如服务器提供程序的上一步所示。

     [ServiceContract] public interface ISyncService { [OperationContract] SyncContext ApplyChanges(SyncGroupMetadata groupMetadata, DataSet dataSet, SyncSession syncSession); [OperationContract] SyncContext GetChanges(SyncGroupMetadata groupMetadata, SyncSession syncSession); [OperationContract] SyncSchema GetSchema(Collection 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()