Azure 移动服务 - 在线解决离线插入

Azure Mobile Services - Resolving offline Insert with online

我有一个 Offline Sync Table,我在其中插入了一个项目。我的移动服务 Web Api 控制器添加并 returns 一个不同于使用 IMobileServiceSyncTable<T>.InsertAsync(item) 插入本地 SQLite 数据库的 ID(预期行为 ).

到服务器的post没问题。该项目由 API 创建。我遇到的问题是在本地解决项目。我正在通过 PullAsync() 操作跟进此操作。当我查看我的项目列表时,我创建的原始项目带有一个 ID 的 guid( 预期行为 ),并且存在通过 API 创建的项目使用我的数据库 ID。我需要将 API 返回的项目与本地项目合并。

我不确定将其移至在线插页是否可以解决我的问题。 我有另一个操作立即取决于此操作的成功。后续操作惨遭失败,因为很明显,在我的 API 中找不到 guid Id 值,我得到一串 HTTP 500 错误。

我想知道是否有解决此问题的最佳实践,或者我不知道的可以轻松解决此问题的方法。我认为这对于使用该框架的人来说很常见?本地 SQLite 存储中的 ID 很可能永远不会与 API.

后面的实际数据库值匹配

我已经阅读了以下内容(以及更多关于该主题的内容),但我仍然不清楚如何解决这个问题。

欢迎任何建议。

The sync framework is pushing all queued operations to the server, i.e. pushing the insert to the api endpoint. The guid id is inserted in the local table, and then immediately pushed to the server. When it returns from the server I do a sync (making sure that I get any updates from the server). After the pull, the local table has two items. The one inserted locally, and the one that was pushed to the API endpoint with a "valid" Id.

为了检查这个问题,我选择 Node.js 作为我的后端语言,而没有下载 c# 服务器项目然后将其部署到 azure 移动应用程序。根据您的描述,我在本地 table 中插入了一个新项目,然后将所有待处理的本地操作推送到远程 table,然后从远程 table 中提取最新的项目。这是 fiddler:

捕获的代码片段和网络跟踪
var todoItem = new TodoItem { Text = TextInput.Text };
//insert a new item into local table
await todoTable.InsertAsync(todoItem);
//push all pending local operations against the remote table
await App.MobileService.SyncContext.PushAsync();  //offline sync
await todoTable.PullAsync("todoItems", todoTable.CreateQuery());

PushAsync 的网络跟踪:

注意: 由于您的本地项目具有 id 属性 的 GUID 值,在针对远程 table 插入期间,服务器不会生成新值,如果 id 值存在则返回 409 冲突。

PullAsync 的网络跟踪:

我建议您捕获网络痕迹以缩小此问题的范围。而且您的推送操作似乎没有按预期工作,您需要检查推送操作响应中的 id 值。如果你构建了 c# 后端,我假设你需要检查你的 table 模型,更多细节你可以参考 adrian hall 的书 here. Also, you could refer to the mobile apps quickstart sample for .NET backend here.