簡體   English   中英

SignalR客戶端方法不調用

[英]SignalR client method does not invoke

我仍在學習SignalR。 在asp.net web Api中,我創建了一個簡單的集線器。 我創建了一個工廠,用於實例化與集線器的連接。

 public class NotificationHub : Hub 
    {
        public void Hello()
        {
            var x = "test";
            Clients.All.hello(x);
        }
    }

客戶端。

.factory("NotificationHub", function(){
        var NotificationHubFactory = {};
        NotificationHubFactory.proxy = null;

         var initialize = function(){
             $.connection.hub.url = "http://localhost:18678/signalr";
             $.connection.hub.start().done(function(response){
                NotificationHubFactory.proxy  = $.connection.notificationHub;
             }).fail(function(error){
                 console.log(error);
             });
         };

         initialize();


        return  NotificationHubFactory;
    });

問題是當我嘗試執行此操作時。

    NotificationHub.proxy.server.hello();
    NotificationHub.proxy.client.hello = function(data){
        console.log(data);
     };

NotificationHub.proxy.client.hello永遠不會被調用。 雖然如果我在集線器中放置一個斷點,則Clients.All.hello(x); 它會觸發,這意味着它無法在客戶端中找到hello方法。

任何想法是什么問題?

hub.start()之前,您需要至少將一個事件處理程序附加到集線器。 否則,客戶端將永遠不會在中心注冊。 請參閱此處文檔中的此說明 ...

通常,您在調用start方法建立連接之前注冊事件處理程序。 如果要在建立連接后注冊一些事件處理程序,則可以這樣做,但是在調用start方法之前,必須至少注冊一個事件處理程序。 原因之一是應用程序中可能有許多集線器,但是如果您只想使用其中一個集線器,則不想在每個集線器上觸發OnConnected事件。 建立連接后,指示集線器觸發OnConnected事件的集線器代理上存在客戶端方法。 如果您在調用start方法之前未注冊任何事件處理程序,則可以在Hub上調用方法,但是不會調用Hub的OnConnected方法,並且不會從服務器調用任何客戶端方法。

嘗試這個...

.factory("NotificationHub", function(){
        var NotificationHubFactory = {};
        NotificationHubFactory.proxy = null;

         var initialize = function(){
             $.connection.hub.url = "http://localhost:18678/signalr";
             $.connection.notificationHub.client.hello = function () {};
             $.connection.hub.start().done(function(response){
                NotificationHubFactory.proxy  = $.connection.notificationHub;
             }).fail(function(error){
                 console.log(error);
             });
         };

         initialize();


        return  NotificationHubFactory;
    });

然后在調用服務器之前替換hello處理程序...

NotificationHub.proxy.client.hello = function(data){
    console.log(data);
};
NotificationHub.proxy.server.hello();

該代碼還有一個潛在的問題,因為hub.start()是異步的,並且調用可以在Hub准備好之前進行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM