我有一个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消息总线交互的示例代码/文档将不胜感激。谢谢!
答案 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
};
}
}