SignalR 多集线器连接 .NET Core

SignalR Multiple Hub Connection .NET Core

我有 2 个集线器 类,

SystemNotificationHub.cs

public class SystemNotificationHub : Hub { }

QuotationChatHub.cs

public class QuotationChatHub: Hub { }

SystemNotificationHub_Layout.cshtml 中定义,因此用户可以连续连接到集线器, 当用户进入 QuotationChat.cshtml 页面时,我还希望同一用户连接 QuotationChatHub,因此我希望用户以一种简单的方式同时连接多个集线器。

我不能让用户同时连接超过 1 个集线器。我怎样才能做到这一点?

启动端点配置

endpoints.MapHub<SystemNotificationHub>("/systemNotificationHub");

endpoints.MapHub<QuotationHub>("/quotationHub");

quotationChat.js

$(function () {
    if (connection === null) {
        connection = new signalR.HubConnectionBuilder()
            .withUrl("/quotationHub")
            .build();

        connection.start().then(function () {
            document.getElementById('sendButton').onclick = function () {
                connection.invoke("BroadcastFromClient")
                    .catch(function (err) {
                        return console.error(err.toString());
                    });
            };
        });
    }
});

notification.js


$(function () {
    if (connection === null) {
        connection = new signalR.HubConnectionBuilder()
            .withUrl("/systemNotificationHub")
            .build();

        connection.on("Notify", function (response) {

        });

        connection.on("HubError", function (response) {
            alert(response.error);
        });

        connection.start().then(function () {
            connection.invoke("NotificationMethod")
                .catch(function (err) {
                    return console.error(err.toString());
                });
        });
    }
});

据我所知,这个问题与你代码中的 if 条件有关。

您在创建连接构建器之前检查过连接是否为空。但是两个js都使用相同的连接模型

为了解决这个问题,我建议您可以尝试为 systemNotificationHub 创建一个新连接,例如 connection1,这样您的代码就可以正常工作了。

更多详情,您可以参考以下代码:

quotationChat.js 未更改。

notification.js:

//Define a new connection1 as the new js object as connection
$(function () {
    if (connection1 === null) {
        connection1 = new signalR.HubConnectionBuilder()
            .withUrl("/systemNotificationHub")
            .build();

        connection1.on("Notify", function (response) {

        });

        connection1.on("HubError", function (response) {
            alert(response.error);
        });

        connection1.start().then(function () {
            connection.invoke("NotificationMethod")
                .catch(function (err) {
                    return console.error(err.toString());
                });
        });
    }
});