2013-03-18 47 views
13

Tôi có nhiều dịch vụ SignalR 'đang chạy và chỉ có một giao diện người dùng để truy cập chúng.Khách hàng SignalR với nhiều kết nối

Tôi làm cách nào để khách hàng có thể nói chuyện với nhiều kết nối với Url khác nhau? Bởi vì có vẻ như tôi chỉ có thể chỉ định một url cho mỗi $ .connection.hub và tôi không thể sử dụng nhiều tập lệnh máy khách 'signalr/hubs'.

Bất kỳ trợ giúp nào? Cảm ơn.

Trả lời

23

$ .connection.hub được tạo trong/signalr/hubs include.

Vào cuối của tập tin đó về cơ bản không:

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

Để tạo proxy hub bạn làm:

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

ví dụ đơn giản cho nhiều kết nối:

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(); 
+0

Cảm ơn. Nó hoạt động. – Adamy

+2

Hãy coi chừng rằng các trình duyệt có số lượng kết nối đồng thời hạn chế cho mỗi miền. Vì vậy, nếu bạn mở một vài tab, trang của bạn có thể ngừng tải. – davidfowl

+0

https://github.com/SignalR/SignalR/wiki/SignalR-JS-Client-Hubs-%28No-Proxy%29 cung cấp thêm tài liệu về cách tạo của riêng bạn 'hubConnection's – halter73

6

My giải pháp cho những dịp như vậy:

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 
    }; 
}(); 

Nó lưu trữ nội bộ đối tượng lời hứa từ start() và gắn các trình xử lý nếu cần.

Về cơ bản, bạn chỉ cần gọi SignalRHelpers.SubscribeToConnectionStart mỗi lần bạn cần kết nối. Ví dụ:

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

Điều này giải quyết một vấn đề rất bí ẩn tôi đã có trong SPA của tôi, nơi tôi phải làm mới trang cho SignalR để làm việc trong khi tôi đang trên quan điểm với SignalR, nó chỉ đơn giản là sẽ không hoạt động nếu Tôi đã điều hướng đến nó. Nhưng bằng cách sử dụng SubscribeToConnectionStart thay vì $ .connection.hub.start đơn giản() –

Các vấn đề liên quan