Я исследую способ создания решения n-уровневой синхронизации. Из примера WebSharingAppDemo-CEProviderEndToEnd это кажется практически осуществимым, однако по какой-то причине приложение будет синхронизироваться только в том случае, если у клиента есть живое соединение с БД SQL. Может кто-нибудь объяснить, что мне не хватает и как синхронизировать, не выставляя SQL в интернет?
Проблема, с которой я сталкиваюсь, заключается в том, что, когда я предоставляю поставщика реляционной синхронизации, который имеет открытое соединение SQL от клиента, он работает нормально, но когда я предоставляю поставщика реляционной синхронизации, у которого есть закрытая, но настроенная строка подключения, как в этом примере я получаю сообщение об ошибке из WCF о том, что сервер не получил командный файл. Так что я делаю не так?
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.DataSource = hostName;
builder.IntegratedSecurity = true;
builder.InitialCatalog = "mydbname";
builder.ConnectTimeout = 1;
provider.Connection = new SqlConnection(builder.ToString());
// provider.Connection.Open(); **** un-commenting this causes the code to work**
//create anew scope description and add the appropriate tables to this scope
DbSyncScopeDescription scopeDesc = new DbSyncScopeDescription(SyncUtils.ScopeName);
//class to be used to provision the scope defined above
SqlSyncScopeProvisioning serverConfig = new SqlSyncScopeProvisioning();
....
Ошибка, которую я получаю, возникает в этой части кода WCF:
public SyncSessionStatistics ApplyChanges(ConflictResolutionPolicy resolutionPolicy, ChangeBatch sourceChanges, object changeData)
{
Log("ProcessChangeBatch: {0}", this.peerProvider.Connection.ConnectionString);
DbSyncContext dataRetriever = changeData as DbSyncContext;
if (dataRetriever != null && dataRetriever.IsDataBatched)
{
string remotePeerId = dataRetriever.MadeWithKnowledge.ReplicaId.ToString();
//Data is batched. The client should have uploaded this file to us prior to calling ApplyChanges.
//So look for it.
//The Id would be the DbSyncContext.BatchFileName which is just the batch file name without the complete path
string localBatchFileName = null;
if (!this.batchIdToFileMapper.TryGetValue(dataRetriever.BatchFileName, out localBatchFileName))
{
//Service has not received this file. Throw exception
throw new FaultException<WebSyncFaultException>(new WebSyncFaultException("No batch file uploaded for id " + dataRetriever.BatchFileName, null));
}
dataRetriever.BatchFileName = localBatchFileName;
}
Есть идеи?