使用SignalR和SqlDependency推送数据库更新

时间:2012-03-26 21:29:30

标签: javascript asp.net-mvc-3 signalr sqldependency

是否可以将SignalR与SqlCacheDependency(或SqlDependency)结合使用,将数据库更新直接推送到浏览器? 也许有另一种方法来实现这个功能?

我现在唯一可以使用的工作包括必须从执行数据更新的异步调用中调用addMessage,但这并不真正涵盖来自不同来源的更新(例如更新表的后台服务)

2 个答案:

答案 0 :(得分:5)

您应该可以使用the OnChange event on a SQLDependency。在您的事件处理程序中,您可以通过SignalR发送消息。由于您将从外部呼叫您的集线器,因此您需要使用at the bottom of the documentation here所示的技术:

using SignalR.Infrastructure;

IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
dynamic clients = connectionManager.GetClients<MyHub>(); 
...

答案 1 :(得分:1)

好的,我想出来了,或者至少是一种方法。

我最初无法理解的是你需要在mvc控制器中使用该代码,一旦你完成了这个,显然,你可以使用{来自任何其他位置或应用程序来调用该控制器。 {3}}上课。

@Hightechrider为了完整起见,您需要包含2个以上的引用才能使该代码工作。 这个演示代码是通过PersistentConnection完成的,但是集线器的原理是相同的。

编辑: 我现在在我的asp.net mvc中使用一个线程来管理sqldependency,这感觉就像一个更集成的解决方案。 查看这篇文章,了解如何在asp.net中“正确的方式”实现后台处理 WebRequest

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;    

using SignalR.Infrastructure;
using SignalR.Hosting.AspNet;
using SignalR;

namespace SignalRDemo.Controllers
{
    public class DemoController : Controller
    {
        public void sendMessage( string message)
        {
            IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
            IConnection connection = connectionManager.GetConnection<MyConnection>();

            connection.Broadcast(message);
        }
    }
}