Я реализовал Azure - Автономную синхронизацию на основе документации / образца, предоставленного Microsoft Образец в моем приложении Xamarin Forms.
В предоставленном образце / документации они используют обработчик обслуживания по умолчанию.
// Простая обработка ошибок / конфликтов. Реальное приложение будет обрабатывать различные ошибки, такие как состояние сети, конфликты на сервере и другие, через IMobileServiceSyncHandler.
Так как мне нужно реализовать логику повторов 3 раза , если Pull / Push не удается. В соответствии с документацией, я создал собственный обработчик службы ( IMobileServiceSyncHandler ).
Пожалуйста, найдите мою кодовую логику здесь.
public class CustomSyncHandler : IMobileServiceSyncHandler
{
public async Task<JObject> ExecuteTableOperationAsync(IMobileServiceTableOperation operation)
{
MobileServiceInvalidOperationException error = null;
Func<Task<JObject>> tryExecuteAsync = operation.ExecuteAsync;
int retryCount = 3;
for (int i = 0; i < retryCount; i++)
{
try
{
error = null;
var result = await tryExecuteAsync();
return result;
}
catch (MobileServiceConflictException e)
{
error = e;
}
catch (MobileServicePreconditionFailedException e)
{
error = e;
}
catch (MobileServiceInvalidOperationException e)
{
error = e;
}
catch (Exception e)
{
throw e;
}
if (error != null)
{
if(retryCount <=3) continue;
else
{
//Need to implement
//Update failed, reverting to server's copy.
}
}
}
return null;
}
public Task OnPushCompleteAsync(MobileServicePushCompletionResult result)
{
return Task.FromResult(0);
}
}
Но я не уверен, как обработать / отменить серверную копию на случай, если все 3 попытки повторятся.
В образце TODO они возвращают на основе
MobileServicePushFailedException . Но который доступен, когда мы реализуем IMobileServiceSyncHandler .
Более того, если мы включим пользовательский IMobileServiceSyncHandler, он не будет выполнять код после PushAsync / PullAsync . Даже попытка не загорается в случае каких-либо исключений.
try
{
await this.client.SyncContext.PushAsync();
await this.todoTable.PullAsync(
//The first parameter is a query name that is used internally by the client SDK to implement incremental sync.
//Use a different query name for each unique query in your program
"allTodoItems",
this.todoTable.CreateQuery());
}
catch (MobileServicePushFailedException exc)
{
if (exc.PushResult != null)
{
syncErrors = exc.PushResult.Errors;
}
}
// Simple error/conflict handling. A real application would handle the various errors like network conditions,
// server conflicts and others via the IMobileServiceSyncHandler.
if (syncErrors != null)
{
foreach (var error in syncErrors)
{
if (error.OperationKind == MobileServiceTableOperationKind.Update && error.Result != null)
{
//Update failed, reverting to server's copy.
await error.CancelAndUpdateItemAsync(error.Result);
}
else
{
// Discard local change.
await error.CancelAndDiscardItemAsync();
}
Debug.WriteLine(@"Error executing sync operation. Item: {0} ({1}). Operation discarded.", error.TableName, error.Item["id"]);
}
}
}
Примечание
В моем приложении я пытаюсь повторить попытку только 3 раза в случае ошибки сервера. Я не ищу разрешения конфликтов. Именно поэтому я не добавил код для того же самого.
Если кто-то сталкивался с подобными проблемами и решил их, пожалуйста, помогите.
СТЭЦ.