使用SignalR刷新新闻列表



我有一个asp.net MVC 4.0应用程序。在我的一个视图中,我希望显示来自Web API的当前新闻(IEnumerable<News>)的列表。

问题是,新闻列表可能会频繁更新,也可能不会频繁更新。换句话说,平均每天,后端团队可能必须使用后端CMS输入5到45条新闻。

我需要想办法在浏览器中刷新用户的新闻列表,当然,不需要刷新整个网页。

我最初的想法是添加一个JavaScriptsetInterval()方法,该方法将每隔X毫秒调用Web API,从而提取信息并刷新新闻列表。

虽然这是可行的,但我希望使用不同的方法并使用SignalR,因为我相信该需求符合SignalR所提供的。

在阅读并查看了SignalR上的一些示例后,我开始理解它背后的想法,但我仍然有点困惑。

我看到的例子是聊天室和游戏,用户可以点击触发呼叫hub的内容。

在我的任务中,用户将没有任何东西可点击。hub(服务器)应该负责每X毫秒调用客户端以更新新闻列表。

就性能而言,每X毫秒发送一个完整的新闻列表并覆盖UI是荒谬的。

我需要一种方法来比较当前显示在用户浏览器中的新闻列表与集线器中的新新闻列表。比较完成后,只发送新的比较新闻列表。

有人有这样的例子吗?或者可以给我一些如何开始的建议吗?

感谢

我制作了一个名为SignalR.EventAggregatorProxy的库

它在后端服务总线或事件聚合器之间有一个代理,并将所有或选定的事件无缝转发到客户端。客户端订阅某些事件,但您也可以创建自定义约束,以便用户只接收所述事件的选择。

查看wiki了解如何设置

https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/wiki

使用nuget 安装

Install-Package SignalR.EventAggregatorProxy 

一旦配置好在添加或更新新闻文章时触发事件,您就可以在后端、域、DAL等中的任何地方触发它,只要您的服务总线可以接收它,我的代理也会接收它。

对于UI,使用Knockout或Angular创建一个动态列表,可以将更改推送到UI。在用户第一次连接时加载初始数据,并向事件添加侦听器。一旦事件进入,检查项目是否在列表中,是否更新,是否添加。

林建议的SqlDependency对于琐碎的系统来说是可以的,但一旦你的系统增长,你就不想直接与SQL 耦合

您可以将SqlDependencySignalr一起使用以获取数据库更改通知,然后将IEnumerable<News>knockout可观察数组绑定以自动刷新页面。

有关带有Signalr的SqlDependency的更多信息,请查看以下链接:

http://techbrij.com/database-change-notifications-asp-net-signalr-sqldependency

击倒可观测阵列:

http://knockoutjs.com/documentation/observableArrays.html