【问题标题】:SignalR client method does not invokeSignalR 客户端方法不调用
【发布时间】:2014-08-14 13:35:21
【问题描述】:

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

任何想法是什么问题?

【问题讨论】:

  • 当您交换 2 行以便在调用 server.hello() 之前附加客户端回调时会发生什么?
  • hub.start() 是异步的,因此您有可能在它准备好之前就使用它。但如果是这种情况,您可能会在控制台中看到错误,因为 NotificationHub.proxy 为空。
  • 我在控制台中没有收到任何错误。

标签: c# asp.net angularjs signalr


【解决方案1】:

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

通常在调用 start 方法之前注册事件处理程序 建立连接。如果你想注册一些事件 建立连接后的处理程序,您可以这样做,但是您 在调用 启动方法。造成这种情况的一个原因是在一个 应用程序,但您不想触发 OnConnected 事件 每个集线器,如果您只使用其中一个集线器。当。。。的时候 连接建立后,Hub 上存在客户端方法 proxy 告诉 SignalR 触发 OnConnected 事件。如果你 在调用 start 方法之前不要注册任何事件处理程序,你 将能够调用集线器上的方法,但集线器的 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() 是异步的,调用可能在集线器准备好之前发生。

【讨论】:

  • 现在工作正常我刚刚从控制器中删除了 NotificationHub.proxy.client.hello 并将其添加到服务中。
  • 但是我可以看到 OnConected 方法在没有将任何事件处理程序附加到集线器的情况下触发。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
  • 2018-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多