这里有没有人使用过 Sync Framework 并通过 WCF 端点进行同步?请分享代码示例或示例项目。我专门寻找客户端上线仅从服务器获取更新的离线场景。
问问题
12961 次
1 回答
28
我执行以下操作以使同步框架在 SQL Server 2008 中使用 WCF
- 在 SQL Server 2008 中启用更改跟踪
- 为参与同步的表启用更改跟踪
- 添加了一个名为 anchor 的元数据表
- 添加了一个表来跟踪名为“guid”的客户端 ID
- 使用 MSF 的 codeplex 项目站点提供的 SqlExpressClientSyncProvider 作为客户端同步提供程序
使用 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;
使用充当服务器同步提供程序的 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<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 实例,并使用一个用于访问 WCF 服务的代理类实例设置 RemoteProvider。LocalProvider 设置为 SqlExpressClientSyncProvider 的实例
- 向 SyncAgent 配置添加了表和同步组
- SyncAgent.Synchronize()
于 2009-11-03T19:05:06.000 回答