Azure移动应用同步服务推送失败,无法插入或更新

时间:2018-12-28 00:40:08

标签: c# azure xamarin.forms azure-mobile-services offline-caching

我有一个运行表控制器的Azure移动应用程序服务,并使用Microsoft.Azure.Mobile.ClientMicrosoft.Azure.Mobile.Client.SQLiteStore Nuget程序包运行了一个本地SQLite存储,如Microsoft文档所示。

从Xamarin.Forms应用程序中,我已经使用实时服务器数据通过直接调用Azure服务来实现实体,而没有任何问题。

尝试使用Azure SDK提供的脱机同步功能执行相同操作,我可以毫无问题地将更改从服务器下拉到客户端,但是尝试在客户端上更改或插入记录然后推送更改失败。

客户端基础实体类:

using System;
using Microsoft.WindowsAzure.MobileServices;

public class TableObject 
{
  public string Id { get; set; }

  [UpdatedAt]
  public DateTimeOffset? UpdatedAt { get; set; }

  [CreatedAt]
  public DateTimeOffset? CreatedAt { get; set; }

  [Version]
  public string Version { get; set; }

  [Deleted]
  public bool Deleted { get; set; }
}

客户端模型:

public class UserData : TableObject
{
  public string UserId { get; set; }
  // Other properties 

  public UserData () { }
  public UserData (UserData userData) : base(userData)
  {
    UserId = userData.UserId;
  }

  public async Task<User> User()
  {
    return await Database.Instance.GetItemAsync<User>(x => x.Id == UserId);
  }
}

服务器型号:

public class UserData : EntityData
{
  [ForeignKey("User")]
  public string UserId { get; set; }
  public User User { get; set; }
  // Other properties
}

我的繁殖步骤:

  1. 从客户端执行发布到API控制器,然后在服务器数据库中插入新的用户记录。 成功
  2. 使用同步服务从客户端执行推送(不推送记录)。 成功
  3. 使用同步服务将新用户记录从服务器拉到客户端。 成功
  4. 创建UserData记录设置用户ID,并使用同步服务将其保存到客户端本地存储。 成功
  5. 使用同步服务将新记录从本地存储推送到服务器。 失败

    捕获(MobileServicePushFailedException排除) {   如果(exc.PushResult!= null)   {     syncErrors = exc.PushResult.Errors;   } }

exc堆栈跟踪:

at Microsoft.WindowsAzure.MobileServices.Sync.MobileServiceSyncContext+<ExecuteSyncAction>d__34.MoveNext () [0x00090] in <24dbefba60fd49f4b193cdf58abf3290>:0 
--- End of stack trace from previous location where exception was thrown ---
  at Microsoft.WindowsAzure.MobileServices.Sync.MobileServiceSyncContext+<PushAsync>d__33.MoveNext () [0x00143] in <24dbefba60fd49f4b193cdf58abf3290>:0 

PushResult具有单个插入失败,并且该项目包含2个属性(Id,UserId)。结果和状态为null,处理的为false,并且永远不会调用表控制器中的post方法。请记住,在拉取过程中会调用表控制器上的Get方法。

如果我们拉用户记录,在本地更新它,然后尝试将其向上推,也会发生这种情况。

0 个答案:

没有答案