【发布时间】:2013-04-05 19:45:58
【问题描述】:
我正在开发一个 Web 应用程序,它应该查询 Web 服务 (ASP.NET Web API) 以获取某些数据,并将结果可视化。当客户端应用程序运行时,查询的数据可能会发生变化,因为项目可能会添加到相应的数据库集合中或从相应的数据库集合中删除。客户端本身或其他客户端都可以修改集合(通过 Web 服务)。数据库服务器 RavenDB 能够将更改通知其客户端(Web 服务)。
我想知道的是,当 Web 服务中的数据发生变化时,客户端应该如何保持最新状态?具体来说,如果 Web 服务的数据库发生变化,导致客户端的数据视图变得过时,客户端应该会收到新的查询结果。保持与客户端的持久连接是个好主意吗?通过SignalR,并在每次对数据库进行更改时简单地通知他们,以便每个客户端都可以重新查询数据?如果这些更改通知变得过于频繁,是否应该限制它们?
示例场景
数据库包含以下项目(JSON 表示法):
[{"Id": "2", "User": "usera"}, {"Id": "1", "User": "usera"},
{"Id": "3", "User": "userb"}, {"Id": "4", "User": "usera"}]
客户端 A 请求 User == "usera" 的项目,分页至最多 2 个项目并按 Id 排序;该服务返回以下集合:
[{"Id": "1", "User": "usera"}, {"Id": "2", "User": "usera"}]
然后客户端B告诉服务删除以下项:{"Id": "2", "User": "usera"},这样数据库就变成了:
[{"Id": "1", "User": "usera"}, {"Id": "3", "User": "userb"},
{"Id": "4", "User": "usera"}]
现在的问题是,Web 服务如何通知客户端 A 它应该重新查询新数据?也就是说,客户端 A 应刷新其视图以包含以下内容:
[{"Id": "1", "User": "usera"}, {"Id": "4", "User": "usera"}]
【问题讨论】:
-
您是否还有必须管理的并发要求,例如如果两个客户端更改相同的数据会怎样……谁会赢?
-
@EricJ。我想它必须以某种方式处理,但我认为它可以在以后考虑?我确信 RavenDB 至少有某种用于冲突检测的逻辑。可能会向检测到冲突的服务客户端发出冲突错误信号。
-
您可以阅读 Raven 的乐观并发here。您还需要考虑如何在 SignalR 通知中确定 - 谁会收到通知。安全权限可能会在任何复杂的应用程序中发挥作用。
-
@MattJohnson 谢谢 :)
标签: web-services asp.net-web-api ravendb signalr