如何在ASP.Net中执行服务器端数据库轮询?

时间:2014-09-10 10:31:13

标签: c# asp.net angularjs mongodb signalr

我在angular.js,WebAPI和mongodb上运行了一个应用程序。我的目标是用signalr替换客户端轮询。由于mongodb不会在更改时触发事件,我仍然需要在服务器端进行轮询,如果我检测到更改,则使用信号器集线器进行广播。

有没有一种可行的方法可以做到这一点,而不会破坏IIS的重复性任务?

我尝试了什么:

  1. Hangfire:看起来像推荐的解决方案,但目前仅支持SQL Server和redis(不是选项)。
  2. HostingEnvironment.QueueBackgroundWorkItem:可能会工作,但我担心它没有被广泛使用,我可能会错过一些陷阱。
  3. 有一种方法可以通过使用" tailable游标来加载来自mongo的事件。#34; - 不是选项

2 个答案:

答案 0 :(得分:2)

答案一如既往:“这取决于”。

  • HostingEnvironment.QueueBackgroundWorkItem。 .NET 4.5.2中的最新版本。不保证执行,请参阅post末尾的限制:

  • WebBackgrounder。来自Scott Hanselman的引用blog:“它的代码多年没有被触及,但WebBackgrounder NuGet软件包已下载了近50万次”。

  • 迟发型。流行的开源项目,添加mongodb支持始终是一个受欢迎的PR:)

  • 使用RavenDb而不是MongoDb。他们的Changes API非常酷。

第一个和第二个选项不保证作业执行,第三个和第四个选项依赖于数据存储。

答案 1 :(得分:0)

QueueBackgroundWorkItem是您考虑我们上面讨论过的最佳选择,但它不是100%防弹。应用程序池仍将循环使用。您可以创建一个Windows服务,通知Web应用程序轮询数据库。

无论如何,一旦你获得了信号(通过轮询或什么不是),你可以从那时开始使用事件驱动设计。好处是解耦域和可伸缩性。我已经为此创建了这个框架。

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