【问题标题】:SignalR client with multiple connections具有多个连接的 SignalR 客户端
【发布时间】:2013-03-18 01:57:25
【问题描述】:

我正在运行多个 SignalR“服务”,并且只有一个 UI 可以访问它们。

如何让客户端 js 与具有不同 Url 的多个连接进行通信?因为似乎我只能为每个 $.connection.hub 指定一个 url,而且我不能使用多个 'signalr/hubs' 客户端脚本。

有什么帮助吗?谢谢。

【问题讨论】:

    标签: jquery asp.net-mvc signalr signalr-hub


    【解决方案1】:

    $.connection.hub 在 /signalr/hubs 包含中创建。

    在文件的末尾,它实际上是:

    $.connection.hub = $.hubConnection("/signalr", { useDefaultPath: false });
    

    要创建您执行的集线器代理:

    var myHub = $.connection.hub.createHubProxy('myHub');
    

    多个连接的简单示例:

    var connection1 = $.hubConnection("http://www.myfirstendpoint.com");
    var connection2 = $.hubConnection("http://www.mysecondendpoint.com");
    
    var myCon1Hub = connection1.createHubProxy('myCon1Hub');
    var myCon2Hub = connection2.createHubProxy('myCon2Hub');
    
    myCon1Hub.client.foo = function() { ... Whatever you want ... };
    myCon2Hub.client.foo = function() { ... Whatever you want ... };
    
    connection1.start();
    connection2.start();
    

    【讨论】:

    • 请注意,浏览器每个域的并发连接数是有限的。因此,如果您打开几个标签页,您的页面可能会停止加载。
    • github.com/SignalR/SignalR/wiki/… 提供了有关创建自己的hubConnections 的更多文档
    • 这是应包含在 SignalR 文档中的重要信息。我建议将其添加到ASP.NET SignalR Hubs API Guide - JavaScript Client
    • @dfowler 关于并发连接,这适用于 Web Socket 连接还是仅适用于 AJAX?我的意思是,如果你能保证 SignalR 会使用 Web Sockets,你还需要担心这个吗?
    • 这个解决方案是否也可以使用自动生成的代理?
    【解决方案2】:

    我对这种情况的解决方案:

    var SignalRHelpers = function () {
      var _connectionDeferred;
    
      var subscribeToConnectionStart = function (callback) {
        if (!_connectionDeferred)   // start connection if not yet initialized
            _connectionDeferred = $.connection.hub.start();
    
        if ($.connection.hub.state == $.connection.connectionState.connected && callback) {
            // already connected
            callback();
        } else if (callback) {
            // register handler
            _connectionDeferred.done(callback);
        }
      };
    
      return {
        SubscribeToConnectionStart: subscribeToConnectionStart
      };
    }();
    

    它在内部存储来自 start() 的 promise 对象,并根据需要附加处理程序。

    基本上,您只需在每次需要连接时调用 SignalRHelpers.SubscribeToConnectionStart。例如

    SignalRHelpers.SubscribeToConnectionStart(function(){
        someHub.server.executeSomething();
    });
    

    【讨论】:

    • 这解决了我在 SPA 中遇到的一个非常神秘的问题,当我在 SignalR 的视图中时,我必须刷新页面才能让 SignalR 工作,如果我导航到它。但是使用 SubscribeToConnectionStart 而不是普通的 $.connection.hub.start()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 2012-04-05
    • 2012-04-22
    相关资源
    最近更新 更多