gpt4 book ai didi

c# - Xamarin 中的 Azure 移动服务 412 失败

转载 作者:太空宇宙 更新时间:2023-11-03 18:26:03 25 4
gpt4 key购买 nike

每当尝试通过 MobileServices 更新项目时,我总是收到 412 错误 (PreconditionFailed)。我相信这是最近才开始的,但不幸的是,这个错误给我提供的信息很少。

根据 https://azure.microsoft.com/en-us/documentation/articles/mobile-services-windows-store-dotnet-handling-conflicts-offline-data/,我已经设置了一个冲突解决程序,其想法是在发生任何冲突时以客户端版本为赢家。 .为此,我重复了 push 的调用。然而,我在两次推送中都遇到了 412 失败,而不仅仅是第一次。

这是我的处理程序代码。 . .

    public class AzureConflictHandler : IMobileServiceSyncHandler
{
readonly ILogger _logger;
public AzureConflictHandler(ILogger logger){
_logger = logger;
}
#region IMobileServiceSyncHandler implementation

public Task OnPushCompleteAsync (MobileServicePushCompletionResult result)
{
return Task.FromResult (false);
}

public async Task<JObject> ExecuteTableOperationAsync (IMobileServiceTableOperation operation)
{
try{
await operation.ExecuteAsync ();
return null;
}
catch (MobileServiceConflictException ex)
{
_logger.HandleException (ex);
}
catch (MobileServicePreconditionFailedException ex)
{
_logger.HandleException (ex);

//https://codemilltech.com/why-cant-we-be-friends-conflict-resolution-in-azure-mobile-services/
}
catch(Exception e){
_logger.HandleException (e);
throw;
}

try
{
//retry so we'll take the client value
await operation.ExecuteAsync();
return null;
}
catch (MobileServicePreconditionFailedException e)
{
_logger.HandleException(e, LogLevel.Fatal);
return e.Value;
}
}

#endregion


}

还有其他人看到过这个错误吗?我的数据对象中有一个 Version 字段,如下所示。 . .

        public string id { get; set; }
public string EntityType { get; set; }
public Guid EntityID { get; set; }
public string EntityJSON { get; set; }
public DateTimeOffset LastUpdatedDate { get; set; }

[Microsoft.WindowsAzure.MobileServices.Version]
public string Version { set; get; }

最佳答案

我不确定为什么该教程会这样说,但目前它是不正确的。

第二次调用execute,不会改变结果,local item永远不会自动修改。 (从技术上讲,如果你只想要最后一次写入胜利(客户端),你可以从你的数据模型中删除版本,你永远不会得到 412。)

假设从长远来看,您需要一个更复杂的策略,您需要使用服务器的版本副本更新本地项目的版本。

catch (MobileServicePreconditionFailedException ex) {
var serverValue = ex.Value;

// Resolve in favor of our client by just using the server's version
var item = operation.Item;
item[MobileServiceSystemColumns.Version] = serverValue[MobileServiceSystemColumns.Version];

// this will save the item changes to the local store so next Push()
// will resolve this
operation.UpdateOperationAsync(item)
throw ex;

虽然您在上面的代码中立即重试,但请注意它应该处于循环中,因为另一个客户端也可能正在更新它,等等。

在那种情况下你可以做一些更像

while (some condition) {
try {
return await operation.ExecuteAsync();
} catch (obileServicePreconditionFailedException ex) {
var serverItem = ex.Value;
operation.item[MobileServiceSystemColumns.Version] = serverValue[MobileServiceSystemColumns.Version];
} catch ...
}

https://github.com/Azure/mobile-services-samples/blob/master/TodoOffline/WindowsUniversal/TodoOffline/TodoOffline.Shared/SyncHandler.cs#L27

关于c# - Xamarin 中的 Azure 移动服务 412 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34319276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com