public async static Task SyncHttpThroughKestellAsync() { // server provider var serverProvider = new SqlSyncProvider(GetDatabaseConnectionString("AdventureWorks")); // proxy server based on server provider var proxyServerProvider = new WebProxyServerProvider(serverProvider); // client provider var client1Provider = new SqlSyncProvider(GetDatabaseConnectionString("Adv")); // proxy client provider var proxyClientProvider = new WebProxyClientProvider(); var tables = new string[] { "ProductCategory", "ProductDescription", "ProductModel", "Product", "ProductModelProductDescription", "Address", "Customer", "CustomerAddress", "SalesOrderHeader", "SalesOrderDetail" }; var configuration = new SyncConfiguration(tables) { ScopeName = "AdventureWorks", ScopeInfoTableName = "tscopeinfo", SerializationFormat = Dotmim.Sync.Enumerations.SerializationFormat.Binary, DownloadBatchSizeInKB = 400, StoredProceduresPrefix = "s", StoredProceduresSuffix = "", TrackingTablesPrefix = "t", TrackingTablesSuffix = "", }; var serverHandler = new RequestDelegate(async context => { proxyServerProvider.Configuration = configuration; await proxyServerProvider.HandleRequestAsync(context); }); using (var server = new KestrellTestServer()) { var clientHandler = new ResponseDelegate(async(serviceUri) => { proxyClientProvider.ServiceUri = new Uri(serviceUri); var syncAgent = new SyncAgent(client1Provider, proxyClientProvider); do { Console.Clear(); Console.WriteLine("Sync Start"); try { CancellationTokenSource cts = new CancellationTokenSource(); Console.WriteLine("--------------------------------------------------"); Console.WriteLine("1 : Normal synchronization."); Console.WriteLine("2 : Fill configuration from server side"); Console.WriteLine("3 : Synchronization with reinitialize"); Console.WriteLine("4 : Synchronization with upload and reinitialize"); Console.WriteLine("5 : Deprovision everything from client side (tables included)"); Console.WriteLine("6 : Deprovision everything from client side (tables not included)"); Console.WriteLine("7 : Deprovision everything from server side (tables not included)"); Console.WriteLine("8 : Provision everything on the client side (tables included)"); Console.WriteLine("9 : Provision everything on the server side (tables not included)"); Console.WriteLine("10 : Insert datas on client"); Console.WriteLine("--------------------------------------------------"); Console.WriteLine("What's your choice ? "); Console.WriteLine("--------------------------------------------------"); var choice = Console.ReadLine(); if (int.TryParse(choice, out int choiceNumber)) { Console.WriteLine($"You choose {choice}. Start operation...."); switch (choiceNumber) { case 1: var s1 = await syncAgent.SynchronizeAsync(cts.Token); Console.WriteLine(s1); break; case 2: SyncContext ctx = new SyncContext(Guid.NewGuid()); SqlSyncProvider syncConfigProvider = new SqlSyncProvider(GetDatabaseConnectionString("AdventureWorks")); (ctx, configuration.Schema) = await syncConfigProvider.EnsureSchemaAsync(ctx, new Dotmim.Sync.Messages.MessageEnsureSchema { Schema = configuration.Schema, SerializationFormat = Dotmim.Sync.Enumerations.SerializationFormat.Json }); break; case 3: s1 = await syncAgent.SynchronizeAsync(SyncType.Reinitialize, cts.Token); Console.WriteLine(s1); break; case 4: s1 = await syncAgent.SynchronizeAsync(SyncType.ReinitializeWithUpload, cts.Token); Console.WriteLine(s1); break; case 5: SqlSyncProvider clientSyncProvider = syncAgent.LocalProvider as SqlSyncProvider; await clientSyncProvider.DeprovisionAsync(configuration, SyncProvision.All | SyncProvision.Table); Console.WriteLine("Deprovision complete on client"); break; case 6: SqlSyncProvider client2SyncProvider = syncAgent.LocalProvider as SqlSyncProvider; await client2SyncProvider.DeprovisionAsync(configuration, SyncProvision.All); Console.WriteLine("Deprovision complete on client"); break; case 7: SqlSyncProvider remoteSyncProvider = new SqlSyncProvider(GetDatabaseConnectionString("AdventureWorks")); await remoteSyncProvider.DeprovisionAsync(configuration, SyncProvision.All); Console.WriteLine("Deprovision complete on remote"); break; case 8: SqlSyncProvider clientSyncProvider2 = syncAgent.LocalProvider as SqlSyncProvider; await clientSyncProvider2.ProvisionAsync(configuration, SyncProvision.All | SyncProvision.Table); Console.WriteLine("Provision complete on client"); break; case 9: SqlSyncProvider remoteSyncProvider2 = new SqlSyncProvider(GetDatabaseConnectionString("AdventureWorks")); await remoteSyncProvider2.ProvisionAsync(configuration, SyncProvision.All); Console.WriteLine("Provision complete on remote"); break; case 10: var c = GetDatabaseConnectionString("Adv"); var catId = await InsertProductCategory(c); var modelId = await InsertProductModel(c); await InsertProduct(c, catId, modelId); Console.WriteLine("Inserted a model, a category and a product."); break; default: break; } } } catch (SyncException e) { Console.WriteLine(e.ToString()); } catch (Exception e) { Console.WriteLine("UNKNOW EXCEPTION : " + e.Message); } Console.WriteLine("--------------------------------------------------"); Console.WriteLine("Press a key to choose again, or Escapte to end"); } while (Console.ReadKey().Key != ConsoleKey.Escape); }); await server.Run(serverHandler, clientHandler); } }