C# Azure服务总线与Signal的集成
这个问题不是关于信号器和Azure服务总线的扩展。我想在我的SignalR web socket应用程序中构建一个服务总线侦听器(例如OnMessage),然后将消息相应地分发给连接的用户。消息将从各种单独运行的服务发布到集中式服务总线,连接到web套接字服务器的UI/浏览器应接收这些消息 选项1:我可以将异步任务添加到集线器方法中,以订阅服务总线并按连接的用户进行筛选。问题是,它使用线程池中的额外线程,并且将为用户启动的每个套接字连接执行此操作。我们的应用程序可以轻松地为每个打开的选项卡启动5-10个或更多插槽 选项2:我可以向信号器启动配置方法添加一个任务,然后该方法接收所有消息并将它们分发给正确连接的用户。我在这里遇到的问题是,我无法访问用于发送到浏览器的Clients对象C# Azure服务总线与Signal的集成,c#,websocket,signalr,azureservicebus,C#,Websocket,Signalr,Azureservicebus,这个问题不是关于信号器和Azure服务总线的扩展。我想在我的SignalR web socket应用程序中构建一个服务总线侦听器(例如OnMessage),然后将消息相应地分发给连接的用户。消息将从各种单独运行的服务发布到集中式服务总线,连接到web套接字服务器的UI/浏览器应接收这些消息 选项1:我可以将异步任务添加到集线器方法中,以订阅服务总线并按连接的用户进行筛选。问题是,它使用线程池中的额外线程,并且将为用户启动的每个套接字连接执行此操作。我们的应用程序可以轻松地为每个打开的选项卡启动5
我觉得信号器和服务总线是一个很好的互补,可以实现近实时通信,但我发现实现这样一个场景的可能性很小。我觉得这应该是一个足够普遍的情况。也许我遗漏了一些明显的设计模式,而这些模式可能是一个更好的解决方案。我能够解决这个问题。在signarstartup.Configuration方法中,我添加了一个启动侦听器的方法,并在该方法中调用了GlobalHost.ConnectionManager.GetHubContext。目前,这不会发送给单个用户,但我将添加某种连接管理器来处理这一问题
public void startServiceBusListener()
{
// setup subcsription
var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
if (!namespaceManager.SubscriptionExists("myTopic", Environment.MachineName))
namespaceManager.CreateSubscription("myTopic", Environment.MachineName);
SubscriptionClient busClient = SubscriptionClient.CreateFromConnectionString(connectionString, "myTopic", Environment.MachineName);
// Configure the callback options.
OnMessageOptions options = new OnMessageOptions();
options.AutoComplete = false;
options.AutoRenewTimeout = TimeSpan.FromMinutes(1);
receiveTask = Task.Run(() =>
{
// handle new messages
busClient.OnMessage((message) =>
{
try
{
Notification note = message.GetBody<Notification>();
string notification = JsonConvert.SerializeObject(note);
GlobalHost.ConnectionManager.GetHubContext<DispatchHub>().Clients.All.notify(notification);
// Remove message from subscription.
message.Complete();
}
catch (Exception)
{
// Indicates a problem, unlock message in subscription.
message.Abandon();
}
}, options);
}, cts.Token);
}
public void startServiceBusListener()
{
//设置子脚本
var namespaceManager=namespaceManager.CreateFromConnectionString(connectionString);
如果(!namespaceManager.SubscriptionExists(“myTopic”,Environment.MachineName))
namespaceManager.CreateSubscription(“myTopic”,Environment.MachineName);
SubscriptionClient busClient=SubscriptionClient.CreateFromConnectionString(connectionString,“myTopic”,Environment.MachineName);
//配置回调选项。
OnMessageOptions=新建OnMessageOptions();
options.AutoComplete=false;
options.AutoRenewTimeout=TimeSpan.FromMinutes(1);
receiveTask=Task.Run(()=>
{
//处理新消息
busClient.OnMessage((消息)=>
{
尝试
{
通知注释=message.GetBody();
字符串通知=JsonConvert.SerializeObject(注意);
GlobalHost.ConnectionManager.GetHubContext().Clients.All.notify(通知);
//从订阅中删除邮件。
message.Complete();
}
捕获(例外)
{
//表示存在问题,请在订阅中解锁消息。
消息。放弃();
}
},选项);
},cts.Token);
}