2012-12-28 95 views
5

我無法獲取SignalR服務器端中心代碼來調用JS客戶端方法。反過來工作正常 - 所以當我的客戶端發送消息到服務器時,它按預期發送。我一直很小心避免出現明顯的陷阱,但我想我仍然可以忽略一些東西。這裏是我的代碼:未調用SignalR JS客戶端方法

從MessageHub.cs:

public bool SendMessage(ClientMessage message) 
{ 
    ... 
    Clients.All.addMessage("my message"); 
    ... 
} 

的Javascript:

$.connection.hub.start() 
    .done(function() { 
     messageHub = $.connection.message; 

     // addMessage is never invoked. 
     messageHub.client.addMessage = function (message) { 
      alert('message added'); 
     }; 

     /* // I tried this based on some sample code but still not invoked. 
     messageHub.addMessage = function (message) { 
      alert('message added'); 
     }; 
     */ 

     // This works as expected. 
     messageHub.server.registerUser(userId); 
     ... 
    }); 

正如上面提到的,我無法找到設置,但這裏的任何明顯的缺陷有幾個可能相關的要點:

  • 建立連接並調用服務器端方法。
  • 這可能是不相關的,但我試過強迫不同的運輸行爲沒有改變。
  • 客戶端方法名稱在任何時候都不與服務器方法名稱衝突。
  • 我也嘗試將消息發送到特定的客戶端連接(在這種情況下實際上是目標)。
  • 我在客戶端和服務器上都啓用了日誌記錄,但在任何情況下都沒有看到任何相關內容。

因此,鑑於上述情況,我失去了一些東西明顯?如果不是,確定故障點的最佳方法是什麼?

P.S.這與問題沒有特別的關係,但由於某種原因,Fiddler不再捕獲任何瀏覽器的任何流量,這使得調試WS或HTTP流量有點具有挑戰性 - 我猜這是Windows 8的事情。 。

回答

29

所以,答案其實很簡單(雖然自上次發佈我從1.0.0.0-RC1升級到1.0.0.0 - 但我相當肯定,沒有signficantly改變這種情況)。

我找到了答案在這裏:https://stackoverflow.com/a/15074002/32935(注意,特別是,我的解決辦法是提供的第一個答案 - 儘管第二幫我找出原因)。

本質,對於那些誰不想去到原來的答案,我呼籲對連接start()一種方法,在done()回調反對,因爲我在做之前必須設置我的客戶的方法。這裏有一個例子:

$.connection.message.client.addMessage = function (message) { 
    alert('Now it works!'); 
}; 

$.connection.hub.start() 
    .done(function() { 
     console.log('Connection established!'); 
    }); 
+0

你完全保存了我的一天,¡ – vfportero

+0

太棒了!非常感謝! – Oleg

+0

這是非常重要的提示!你救了我幾天:)謝謝! –

-2

當你將鼠標懸停在客戶對象,你看你在JS中定義的所有功能?

,無論如何,我不知道爲什麼你的方式不起作用,但是這是我怎麼寫我的客戶端,和它的作品。也許你可以試試這種方式。

$(function() { 

    var hub = $.connection.RatesHub; 


    $.connection.hub.start().done(function() { 
     /*Logic goes here*/ 
    }); 

    $.extend(hub.client, { 
     FuncName: function (msg) { 
      /*Logic goes here*/ 
     } 
    }); 

} 

你想在你的服務器被識別的任何功能,使用$ .extend。

希望有所幫助。

+0

這種情況在你的情況下起作用的原因是因爲$ .extend在完成方法的回調被調用之前完成。這導致了競爭條件,即如果在start()調用和$ .extend(可能發生)之間發生阻塞執行的任何事件,SignalR就無法訪問任何方法。 –