SignalR客户端方法未调用

本文关键字:调用 方法 客户端 SignalR | 更新日期: 2023-09-27 18:18:08

我还在学习SignalR。在asp.net web Api我创建了一个简单的集线器。在angular中,我已经创建了一个工厂来实例化与hub的连接。

 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方法。

你知道是什么问题吗?

SignalR客户端方法未调用

在调用hub.start()之前,您需要将至少一个事件处理程序附加到集线器。否则,客户端永远不会注册到集线器。在这里查看文档中的注释…

通常在调用start方法之前注册事件处理程序建立连接。如果你想注册一些事件处理程序,您可以这样做,但是您必须注册至少一个事件处理程序,然后才能调用start方法。这样做的一个原因是,在一个对象中可以有许多hub应用程序,但您不希望触发OnConnected事件每个集线器,如果你只使用其中一个。当连接建立后,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()是异步的,调用可能在集线器准备好之前发生。