如何使用SignalR SqlMessageBus发布消息

时间:2013-08-07 19:51:29

标签: signalr

我有一个Windows服务,我想定期发布一些数据。我知道我可以使用.NET HubConnection对象来创建SignalR集线器的代理并通过它发送消息,但由于Web应用程序托管在IIS Web场上,可能会有点hacky。 Web场中心使用基于SQL Server的SqlScaleoutConfiguration背板连接。我真的想做一些像这样的事情:

var config = new SqlScaleoutConfiguration(sqlConnString);
GlobalHost.DependencyResolver.UseSqlServer(sqlConnString); //Redundent??

var messageBus = new SqlMessageBus(GlobalHost.DependencyResolver, config);
var message = new Message("DataHub", "RefreshData", payload);
messageBus.Publish(message);

显然这不起作用。任何有关如何直接与SignalR消息总线交互的示例代码/文档将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:3)

这样的东西应该与sql scale out总线一起工作,尽管我还没有测试过它。

使用RabbitMQ作为背板的SignalR.RabbitMQ project是一个横向扩展总线。

基本上在您的控制台项目中配置消息总线。 获取您要广播的Hub的引用。 然后发送你的消息......

        var factory = new ConnectionFactory
        {
            UserName = "guest",
            Password = "guest"
        };

        var exchangeName = "SignalR.RabbitMQ-Example";

        var configuration = new RabbitMqScaleoutConfiguration(factory, exchangeName);
        GlobalHost.DependencyResolver.UseRabbitMq(configuration); ;

        var hubContext = GlobalHost.ConnectionManager.GetHubContext<Chat>();

        Task.Factory.StartNew(
            () =>
                {
                    int i = 0;
                    while (true)
                    {
                        hubContext.Clients.All.onConsoleMessage(i++);
                        System.Console.WriteLine(i);
                        Thread.Sleep(100);
                    }
                }
            );

马克的答案是正确的,但&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; &GT;&GT;&GT;

以下是我必须做的工作才能使SQL Server向外扩展:

更新服务:

  • 创建集线器类的精确副本(或仅引用它),将消息发送到客户端。枢纽 class需要包含一个占位符方法,以允许消息流过它:

        public class DataHub : Hub {
            // other hub methods here ...
    
            public void RefreshData(SomeAppropriateType messageData)
            {
                // Placeholder method for tunneling data refreshes through the SQL Server scaleout backplane          
            }
        }
    
  • 注册SQL Server数据库:

        var signalrDbConnectionString = ConfigurationManager.ConnectionStrings["signalr"].ConnectionString;
        GlobalHost.DependencyResolver.UseSqlServer(signalrDbConnectionString);
        routes.MapHubs();
    
  • 通过集线器代理类将消息广播到所有客户端:

        var messageData = // instantiate the parameter value of the RefreshData method in the hub class
        var hubContext = GlobalHost.ConnectionManager.GetHubContext<DataHub>();
        Task.Factory.StartNew(() => hubContext.Clients.All.RefreshData(messageData)).Wait();
    

网站:

  • 更新服务的第一步。

  • 像以前一样注册SQL Server数据库,但是在Web应用程序全局设置中的某个位置。

  • 在这些行中为相应的页面编写javascript以接收消息:

        function listenForUpdates() {
            if (updater === undefined) {
                updater = $.connection.dataHub;
            }
    
            if (updater !== undefined) {
                // Declare a function on the hub so the server can invoke it
                updater.client.refreshData = function (value) {
                    // for debugging: console.log(value);
    
                    // update the appropriate page elements with the new data
                };
            }
        }