1

我正在开发一个 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"}]
4

1 回答 1

2

你说的听起来很对。您可以同时托管 Web API 和 SignalR。您可以使用 Web API 检索数据并使用 SignalR 在数据更改时通知客户端。您可以通知客户端数据已更改,以便他们可以重新查询,或者您可以实际将更改发送给客户端,以便他们可以避免重新查询 API。

您还可以使用不同的模型,其中客户端每隔 15 或 30 秒轮询一次服务器并更新可视化结果。这具有不需要持久连接并且更容易实现的优点。但是更改将需要更长的时间才能传播到客户端,如果结果集很大或更改不频繁(因为无论是否实际有任何更改都会发生轮询),您最终可能会消耗更多的带宽。

于 2013-02-11T20:05:04.590 回答