【问题标题】:Using SignalR with SqlDependency to push database updates使用 SignalR 和 SqlDependency 推送数据库更新
【发布时间】:2012-03-26 21:29:30
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    您应该可以使用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>(); 
    ...
    

    【讨论】:

    • 仅供参考,我们计划使用这种机制实现基于 SQL 的横向扩展解决方案。
    【解决方案2】:

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

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

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

    编辑: 我现在在我的 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);
            }
        }
    }
    

    【讨论】:

    • 为什么需要在单独的进程中监控SQL Dependency?您可以在 ASP.NET 下运行的线程中对其进行监控,除非有一些基础设施原因导致您的网站无法直接监控您的数据库?在任何情况下,如果您确实想要这样的 API,最好使用新的 ASP.NET Web API,并且您可能应该将其设置为仅限 HttpPost 的 API,以防止意外(或恶意)调用,只需访问一个网页。
    • @Hightechrider 感谢您的回复,我正计划实施身份验证以防止恶意使用,但使用帖子可能仍然更好。我不知道如何从我的 asp.net mvc 应用程序中启动一个单独的线程,我应该在什么时候启动线程(我正在从全局 asax 中考虑 Application_start,但我不确定)
    • 是的,在 Global.asax 中启动它是典型的。当然,AppPool 可能会在空闲时关闭(这就是您通常需要服务的原因),但在您的情况下,如果没有人使用该站点(通过 SignalR 或其他方式),您并不关心数据库是否正在更新。跨度>
    • 感谢高科技骑手的信息!我目前基于这篇帖子haacked.com/archive/2011/10/16/… 进行植入,我觉得使用 IRegisterOject 给了我更多的控制权,我总是想知道我的线程在哪里,如果你发现我的漂移。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 2014-04-07
    • 2018-01-14
    • 1970-01-01
    • 2014-06-08
    相关资源
    最近更新 更多