SignalR客户端方法不会调用

时间:2014-08-14 04:46:41

标签: c# asp.net angularjs signalr

我还在学习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方法。

任何想法是什么问题?

1 个答案:

答案 0 :(得分:1)

在调用hub.start()之前,您需要将至少一个事件处理程序附加到集线器。没有它,客户端永远不会注册到集线器。请参阅documentation here ...

中的此说明
  

通常在调用start方法之前注册事件处理程序   建立连接。如果你想注册一些活动   建立连接后的处理程序,你可以这样做,但你   必须在调用之前注册至少一个事件处理程序   启动方法。其中一个原因是一个中心可能有很多   应用程序,但您不希望触发OnConnected事件   如果您只使用其中一个,那么每个Hub。当。。。的时候   建立连接,在Hub上存在客户端方法   proxy是告诉SignalR触发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()是异步的,并且调用可能在集线器准备好之前发生。