23

ここで同期フレームワークを使用し、WCF エンドポイントを介して同期している人はいますか? コード サンプルまたはサンプル プロジェクトを共有してください。クライアントがサーバーから更新を取得するためだけにオンラインになるオフラインシナリオを特に探しています。

4

1 に答える 1

28

SQL Server 2008でWCFを使用して同期フレームワークを機能させるために、次のことを行いました

  • SQL Server 2008 で有効な変更追跡
  • 同期に参加しているテーブルの変更追跡を有効にしました
  • アンカーという名前のメタデータ テーブルを追加しました
  • 「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);
    }
    
  • WCF サービスにアクセスするために ServerSyncProvider を実装するプロキシ クラスを作成しました。

    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 に答える