Почему для примера WebSharingAppDemo-CEProviderEndToEnd все еще требуется клиентское соединение БД после создания области для выполнения синхронизации - PullRequest
0 голосов
/ 02 марта 2010

Я исследую способ создания решения 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;
  }

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 29 марта 2010

Полагаю, это просто глупый пример. Он раскрывает «некоторую» технику, но подразумевает, что вы должны расположить ее в правильном порядке самостоятельно.

http://msdn.microsoft.com/en-us/library/cc807255.aspx

0 голосов
/ 05 марта 2010

Если проблема с пакетным файлом отсутствует, удалите параметр IsOneWay = true из IRelationalSyncContract.UploadBatchFile. Когда размер пакетного файла большой, ApplyChanges будет вызываться даже до полного завершения предыдущего файла UploadBatch.

// Заменить
[OperationContract (IsOneWay = true)]

// с
[OperationContract] void UploadBatchFile (строка batchFileid, byte [] batchFile, строка remotePeer1

...