1

我有一个 Windows 服务,我想定期发布一些数据。我知道我可以使用 .NETHubConnection对象创建到 SignalR 集线器的代理并通过它发送消息,但由于 Web 应用程序托管在 IIS 网络场上,这可能会有点麻烦。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 消息总线交互的示例代码/文档将不胜感激。谢谢!!

4

1 回答 1

3

像这样的东西应该适用于 sql 横向扩展总线,尽管我还没有测试过。

来自SignalR.RabbitMQ 项目,该项目是使用 RabbitMQ 作为背板的横向扩展总线。

基本上在您的控制台项目中配置消息总线。获取对要广播到的 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);
                    }
                }
            );

马克的回答是正确的,但是>>>>>>>>>>>>>>>>>>>>

这是我必须做的才能使这项工作适用于 SQL Server 横向扩展:

更新服务:

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

        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
                };
            }
        }
    
于 2013-08-07T21:24:39.530 回答