SignalR客户端具有多个连接

Ada*_*amy 16 asp.net-mvc jquery cors signalr signalr-hub

我有多个SignalR'服务'正在运行,只有一个UI可以访问它们.

如何让客户端js与不同Url的多个连接通信?因为看起来我只能为$ .connection.hub指定一个url,而且我不能使用多个'signalr/hubs'客户端脚本.

有帮助吗?谢谢.

N. *_*len 24

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

在文件的最后它基本上做:

$.connection.hub = $.hubConnection("/signalr", { useDefaultPath: false });
Run Code Online (Sandbox Code Playgroud)

要创建集线器代理,您可以:

var myHub = $.connection.hub.createHubProxy('myHub');
Run Code Online (Sandbox Code Playgroud)

多个连接的简单示例:

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();
Run Code Online (Sandbox Code Playgroud)

  • 使用自动生成的代理也可以使用此解决方案吗? (3认同)
  • 请注意,浏览器每个域的并发连接数量有限.因此,如果您打开几个标签页,您的页面可能会停止加载. (2认同)

Bin*_*neG 6

我对这种场合的解决方案:

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
  };
}();
Run Code Online (Sandbox Code Playgroud)

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

基本上,每次需要连接时,只需调用SignalRHelpers.SubscribeToConnectionStart即可.例如

SignalRHelpers.SubscribeToConnectionStart(function(){
    someHub.server.executeSomething();
});
Run Code Online (Sandbox Code Playgroud)