PullAsync无声失败

时间:2015-03-09 02:24:19

标签: sqlite windows-phone azure-mobile-services

我在Windows Phone应用上使用.Net后端Azure移动服务。我已将Azure移动服务提供的脱机服务添加到使用SQLite的代码中。 该应用程序成功进行Push调用(我可以在我的数据库中看到数据,它们存在于Azure Mobile Offline Services创建的本地数据库中)。 在PullAsync调用中,它对服务(表控制器)进行正确调用,服务计算结果并从数据库返回多行。但是,结果在途中丢失了。我的客户端应用程序正在获取一个空的Json消息(我用fiddler对其进行了双重检查)。

  IMobileServiceSyncTable<Contact> _contactTable;
  /* Table Initialization Code */
  var contactQuery = _contactTable.Where(c => c.Owner == Service.UserId);
  await _contactTable.PullAsync("c0", contactQuery);
  var contacts = await _contactTable.Select(c => c).ToListAsync();

有关如何调查此问题的任何建议吗?

更新

上面的代码通过传递查询ID“c0”来使用增量同步。将null传递给第一个参数的PullAsync会禁用增量同步并使其返回所有行,这些行按预期工作。

await _contactTable.PullAsync(null, contactQuery);

但是,当重新安装应用程序时,我仍然无法获得增量同步以返回行。

3 个答案:

答案 0 :(得分:1)

我遇到了类似的问题,我发现问题是由于我在同一张桌子上进行不同的同步调用造成的 在我的应用程序中,我有一个本地用户列表,我只想了解本地用户的详细信息。

所以我在循环中发出了这个电话

userTbl.PullAsync("Updating User Table", userTbl.CreateQuery().Where(x => x.Id == grp1.UserId || x.Id == LocalUser.Id)

我发现的是,通过将用户ID添加到呼叫中我遇到了问题:

userTbl.PullAsync("User-" + grp1.UserId, userTbl.CreateQuery().Where(x => x.Id == grp1.UserId || x.Id == LocalUser.Id)

作为旁注,根据您的id格式,您提供给查询的字符串长度必须少于50个字符。

: - )

答案 1 :(得分:0)

.NET后端设置为不为具有默认值的字段发送JSON(例如,对于整数为零)。与离线SDK的交互存在一个错误。作为解决方法,您应该在WebConfig中设置默认值处理:

config.Formatters.JsonFormatter.SerializerSettings.DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Include;

您还应该尝试使用在线SDK(使用IMobileServiceTable而不是同步表)进行类似的查询 - 这将有助于缩小问题范围。

答案 2 :(得分:0)

这是调试反序列化的一个非常有用的工具:在MobileServiceClient实例中使用自定义委托处理程序。

public class MyHandler: DelegatingHandler
{
    protected override async Task SendAsync(HttpRequestMessage message, CancellationToken token)
    {
        // Request happens here
        var response = await base.SendAsync(request, cancellationToken);

        // Read response content and try to deserialise here...
        ...

        return response;
    }
}

// In your mobile client code:
var client = new MobileServiceClient("https://xxx.azurewebsites.net", new MyHandler());

这帮助我解决了我的问题。有关详细信息,请参阅https://blogs.msdn.microsoft.com/appserviceteam/2016/06/16/adjusting-the-http-call-with-azure-mobile-apps/