像这样的东西应该适用于 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
};
}
}