SignalR - 多个集线器 - 单独启动连接

时间:2015-09-25 07:30:19

标签: javascript jquery asp.net signalr

我有一个SignalR应用程序,它有多个集线器(集线器是同一解决方案中不同项目的一部分)。

在前端,我想根据用户当前正在查看的组件启动连接。

我们假设我有2个集线器和2个组件:TestHub1TestHub2; Component1Component2

在每个组件中,我实例化连接如下:

var testHub = $.connection.testHub;

            //define client methods

            $.connection.hub.logging = true;
            $.connection.hub.start();
        });

所以我在多个组件中这样做。现在,假设我将两个组件分别连接到TestHub1TestHub2(同时),我怎么才能停止一个连接?如果在任何组件中我调用$.connection.hub.stop(),则两个集线器连接都会停止。

如何单独启动和停止集线器连接? (因为如果在我停止它们之后的某个时刻我拨打$.connection.hub.start(),即使我从使用TestHub1的组件中调用此项,TestHub2也会启动连接。< / p>

所以我正在寻找一种方法来启动和停止单个集线器连接,而不是整个$.connection.start()$.connection.hub.stop()

谢谢!

1 个答案:

答案 0 :(得分:7)

默认生成的代理类为所有集线器创建一个连接。因此,您可以让多个集线器在您的站点上共享一个连接。但是所有集线器都获得相同的HTTP请求信息。 http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-server#multiplehubs

  

由于所有集线器共享相同的连接,因此服务器获取的唯一HTTP请求信息是建立SignalR连接的原始HTTP请求中的内容。如果使用连接请求通过指定查询字符串将信息从客户端传递到服务器,则无法向不同的集线器提供不同的查询字符串。所有中心都将收到相同的信息。

要手动管理每个集线器的连接,您需要自己实现代理:

    var connection = $.hubConnection();
var contosoChatHubProxy = connection.createHubProxy('contosoChatHub');
contosoChatHubProxy.on('addContosoChatMessageToPage', function(name, message) {
    console.log(name + ' ' + message);
});
connection.start().done(function() {
    // Wire up Send button to call NewContosoChatMessage on the server.
    $('#newContosoChatMessage').click(function () {
        contosoChatHubProxy.invoke('newContosoChatMessage', $('#displayname').val(), $('#message').val());
        $('#message').val('').focus();
                });
    });

请查看此处了解更多详情http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-javascript-client#getproxy