2015-10-07 57 views
2

我有SignalR與Angular客戶端一起工作,但如果在訂閱事件之前建立了連接,我無法使proxy.on()工作。在連接到服務器啓動後,SignalR不使用'on'訂閱

我的服務器方法在兩個集線器上調用客戶端方法pushToClient

var connection1 = $.hubConnection(); //Works fine since I started connection AFTER subscribing 
var proxy1 = connection1.createHubProxy('clientPushHub'); 
proxy1.on('sendToClient', function (message) { 
    console.log('This will work: ' + message); 
}); 
connection.start(); 

var connection2 = $.hubConnection(); // Won't work when I subscribe BEFORE starting connection 
var proxy2 = connection2.createHubProxy('clientPushHub'); 
connection2.start(); 
proxy2.on('sendToClient', function (message) { 
    console.log('This will not work: ' + message); 
}); 

如果我改變的事情,這樣開始connection2之前proxy2訂閱了pushToClient,它工作正常。還嘗試在start()。done()回調中執行'on'訂閱,但那不起作用。

我已經下載並驗證this example作品如我所料訂閱後當連接,並this ASP.NET article/section特別提到,你可以做的事情在這個順序,如果你不使用生成的代理,我卻沒有。

this SO question中提問者的工作對我不起作用。

任何想法,我可能會出錯?

回答

5

基於此post,聽起來好像在調用start之前必須至少有一個事件偵聽器。從那裏你可以使用'on'功能添加更多的事件處理程序。

編輯:

試試這個。

proxy2.on('foo',function(){}); 
connection2.start(); 
proxy2.on('sendToClient', function (message) { 
    console.log('This will not work: ' + message); 
}); 

而且這是你linked你交的文章:

注:通常你調用start方法來建立連接之前註冊事件處理。如果您想在建立連接後註冊一些事件處理程序,那麼可以這樣做,但在調用startmethod之前,您必須至少註冊一個事件處理程序。其中一個原因是,應用程序中可能有許多集線器,但如果您只打算使用其中一個集線器,則不會在每個集線器上觸發OnConnected事件。建立連接時,Hub的代理上存在客戶端方法是告訴SignalR觸發OnConnected事件。如果在調用start方法之前沒有註冊任何事件處理程序,您將能夠調用Hub上的方法,但Hub的OnConnected方法將不會被調用,並且不會從服務器調用客戶端方法。

+0

適用於我。另外,感謝您指出文章中的片段。我錯過了它的原因是我在看註冊聽衆的部分,它說你可以在開始後進行。我沒有想到通過開始一段時間,我回頭看了一張便條。 – gilm0079

相關問題