我应该如何持续观察Web服务提供的数据库查询?

时间:2013-02-11 18:04:25

标签: web-services asp.net-web-api ravendb signalr

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

1 个答案:

答案 0 :(得分:2)

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

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