C# Azure服务总线与Signal的集成

C# Azure服务总线与Signal的集成,c#,websocket,signalr,azureservicebus,C#,Websocket,Signalr,Azureservicebus,这个问题不是关于信号器和Azure服务总线的扩展。我想在我的SignalR web socket应用程序中构建一个服务总线侦听器(例如OnMessage),然后将消息相应地分发给连接的用户。消息将从各种单独运行的服务发布到集中式服务总线,连接到web套接字服务器的UI/浏览器应接收这些消息 选项1:我可以将异步任务添加到集线器方法中,以订阅服务总线并按连接的用户进行筛选。问题是,它使用线程池中的额外线程,并且将为用户启动的每个套接字连接执行此操作。我们的应用程序可以轻松地为每个打开的选项卡启动5

这个问题不是关于信号器和Azure服务总线的扩展。我想在我的SignalR web socket应用程序中构建一个服务总线侦听器(例如OnMessage),然后将消息相应地分发给连接的用户。消息将从各种单独运行的服务发布到集中式服务总线,连接到web套接字服务器的UI/浏览器应接收这些消息

选项1:我可以将异步任务添加到集线器方法中,以订阅服务总线并按连接的用户进行筛选。问题是,它使用线程池中的额外线程,并且将为用户启动的每个套接字连接执行此操作。我们的应用程序可以轻松地为每个打开的选项卡启动5-10个或更多插槽

选项2:我可以向信号器启动配置方法添加一个任务,然后该方法接收所有消息并将它们分发给正确连接的用户。我在这里遇到的问题是,我无法访问用于发送到浏览器的Clients对象


我觉得信号器和服务总线是一个很好的互补,可以实现近实时通信,但我发现实现这样一个场景的可能性很小。我觉得这应该是一个足够普遍的情况。也许我遗漏了一些明显的设计模式,而这些模式可能是一个更好的解决方案。

我能够解决这个问题。在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);
}