4

是否可以将 SignalR 与 SqlCacheDependency(或 SqlDependency)结合使用以将数据库更新直接推送到浏览器?也许还有其他方法可以实现此功能?

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

4

2 回答 2

5

您应该能够在 SQLDependency 上使用 OnChange 事件。在您的事件处理程序中,您可以通过 SignalR 发送消息。由于您将从外部调用您的集线器,因此您需要使用此处文档底部显示的技术:

using SignalR.Infrastructure;

IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
dynamic clients = connectionManager.GetClients<MyHub>(); 
...
于 2012-03-27T06:00:10.110 回答
1

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

我最初无法理解的是,您需要在 mvc 控制器中使用该代码,一旦您这样做了,您显然也可以使用WebRequest类从任何其他位置或应用程序调用该控制器。

@Hightechrider 为了完整起见,您需要再包含 2 个引用才能使那段代码正常工作。此演示代码是使用 PersistentConnection 完成的,但集线器的原理是相同的。

编辑:我现在在我的 asp.net mvc 中使用一个线程来管理 sqldependency,这感觉像是一个更集成的解决方案。查看这篇关于如何在 asp.net “正确方式”中实现后台处理的帖子 http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in- asp-net.aspx

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);
        }
    }
}
于 2012-03-27T17:21:07.400 回答