2013-04-17 36 views
15

Tôi dường như gặp sự cố với Trung tâm khách hàng JS của SignalR.Sự kiện Bật trên Trung tâm khách hàng SignalR không được gọi là

Vấn đề là trình xử lý 'bật' dường như không hoạt động - nó không tạo ra lỗi nhưng không nhận được bất kỳ tín hiệu nào được gửi bởi máy chủ. Đoạn mã dưới đây cho thấy một trích xuất nơi tôi gọi máy chủ (sử dụng lời gọi) hoạt động tốt - sau đó trên máy chủ tôi gọi lại để acceptHubData mà nên được chọn trên máy khách nhưng không phải.

Mục tiêu của tôi là khi điều hướng đến các trang mà mỗi trang sẽ mở kết nối với một trung tâm cụ thể và giải phóng kết nối này khi người dùng chuyển sang một trang khác !!

EDIT: sử dụng đoạn mã sau hoạt động nhưng tôi tự hỏi tại sao mã bên dưới sử dụng sự kiện 'bật' không hoạt động!

var superHub = $.connection.mySuperHub; 

    superHub.client.acceptHubData = function (data) { 
     $('<li>hello there' + data + '</li>').prependTo($('#ul1')) 
    } 

    $.connection.hub.start().done(function() { 
     $('<li>done phase 1</li>').prependTo($('#ul1')) 
    }); 

Mọi trợ giúp sẽ được đánh giá cao!

Đây là mã khách hàng (trong js)

$(document).ready(function() { 

    var myHub; 

    try { 

     var connection = $.hubConnection(); 

     connection.start().done(function() { 

      myHub = connection.createHubProxy("mySuperHub"); 

      myHub.on('acceptHubData', function (data) { 
       alert(data); // THIS IS NOT CALLED! 
      }); 

      myHub.invoke('AcceptSignal', "hello from the client2"); 

     }); 

    } 
    catch (e) { 
     alert(e.message); 
    } 
}); 

Đây là mã Server:

[HubName("mySuperHub")] 
public class MyHub : Hub 
{ 

    private readonly HubEngine _hubEngine; 

    public MyHub() : this(HubEngine.Instance) { } 

    public MyHub(HubEngine hubEngine) 
    { 
     _hubEngine = hubEngine; 
    } 

    public void AcceptSignal(string msg) 
    { 
     Clients.Caller.acceptHubData("hi"); 
     Clients.All.acceptHubData("hi"); 
    } 

} 
+0

Xem http://stackoverflow.com/a/42527962/1770868 –

Trả lời

40

Bạn vẫn có thể sử dụng phương pháp on để thêm sự kiện cho JS phương pháp trung tâm khách hàng gọi trong phiên bản mới nhất của SignalR, nhưng nếu bạn không thêm bất kỳ người nghe sự kiện vào một hubProxy trước khi gọi hubConnection.start(), bạn sẽ không được đăng ký đến trung tâm. SignalR đăng ký vào các hub mà bạn có trình xử lý sự kiện khi khởi động hubConnection. Nếu bạn chưa đăng ký với trung tâm của mình, hãy thêm bất kỳ sự kiện nào vào trung tâm đó sau khi bắt đầu() sẽ không hoạt động.

Nếu bạn thêm ít nhất một trình xử lý sự kiện vào hub trước khi bắt đầu(), ngay cả khi nó không làm gì cả, bạn có thể thêm bất kỳ trình xử lý sự kiện bổ sung nào bạn muốn vào hub bằng cách sử dụng on sau khi bắt đầu() và xử lý sẽ được gọi.

Nó không quan trọng nếu bạn thêm một sự kiện sử dụng hubProxy.on('eventName', function (... hoặc autogeneratedHubProxy.client.eventName = function (... trước khi bạn gọi start(), nhưng chỉ on thành công sẽ thêm người nghe sự kiện sau khi start() được gọi.

+1

Tuyệt vời - thực sự hiệu quả - sẽ không đoán được điều đó! Tôi đã thử nghiệm nó bằng cách thêm một sự kiện không tồn tại và cũng hoạt động! Cảm ơn – Marcel

+0

Người đàn ông, tôi đã rách tóc của tôi ra (những gì nhỏ tôi đã để lại) cố gắng tìm ra những gì tôi đã làm sai.Có vẻ như bạn đã đăng ký trước khi bạn bắt đầu, nhưng dường như đó là những gì bạn cần làm. FYI - Tôi đã sử dụng phương thức 'on()' và nó sẽ không hoạt động nếu đăng ký sau 'start()'. – Zach

+0

Cảm ơn người đàn ông nó đã làm việc. –

1

Không chắc chắn phiên bản của SignalR bạn đang sử dụng, nhưng tôi đã thành công hơn khi sử dụng cú pháp sau trên máy chủ của tôi:

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
context.Clients.All.acceptHubData("hello");  

và trên khách hàng của tôi:

myHub.client.acceptHubData = function (data) { 
    console.log(data); 
} 
+0

cảm ơn vì phản hồi - điều đó thực sự hiệu quả - tôi muốn hiểu tại sao nguyên tắc sự kiện 'trên' không hoạt động - hãy xem bản chỉnh sửa của tôi! – Marcel

+0

có khả năng bạn có thể xem tài liệu về phiên bản cũ hơn của signalr. Chắc chắn, đây là cách tiếp cận được đề xuất trong tài liệu ở đây: https://github.com/SignalR/SignalR/wiki/SignalR-JS-Client-Hubs – paul

+0

Tôi đã xem https://github.com/SignalR/ SignalR/wiki/SignalR-JS-Client-Hubs-% 28No-Proxy% 29 – Marcel

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