Signalr 未调用信号器客户端集线器上的On事件

Signalr 未调用信号器客户端集线器上的On事件,signalr,signalr-hub,Signalr,Signalr Hub,我似乎对Signer的JS客户端集线器有问题 问题是“on”处理程序似乎不起作用-它不会生成错误,但不会接收服务器发送的任何信号。 下面的代码显示了一个摘录,我调用服务器(使用invoke)工作正常,然后在服务器上回调acceptHubData,它应该在客户机上获取,但不是 我的目标是在导航到页面时,每个页面都将打开到特定中心的连接,并在用户移动到另一个页面时释放此连接 编辑:使用下面的代码片段是可行的,但我想知道为什么下面使用“on”事件的代码不起作用 var superHub = $

我似乎对Signer的JS客户端集线器有问题

问题是“on”处理程序似乎不起作用-它不会生成错误,但不会接收服务器发送的任何信号。 下面的代码显示了一个摘录,我调用服务器(使用invoke)工作正常,然后在服务器上回调acceptHubData,它应该在客户机上获取,但不是

我的目标是在导航到页面时,每个页面都将打开到特定中心的连接,并在用户移动到另一个页面时释放此连接

编辑:使用下面的代码片段是可行的,但我想知道为什么下面使用“on”事件的代码不起作用

    var superHub = $.connection.mySuperHub;

    superHub.client.acceptHubData = function (data) {
        $('<li>hello there' + data + '</li>').prependTo($('#ul1'))
    }

    $.connection.hub.start().done(function () {
        $('<li>done phase 1</li>').prependTo($('#ul1'))
    });
这是服务器代码:

[HubName("mySuperHub")]
public class MyHub : Hub
{

    private readonly HubEngine _hubEngine;

    public MyHub() : this(HubEngine.Instance) { }

    public MyHub(HubEngine hubEngine)
    {
        _hubEngine = hubEngine;
    }

    public void AcceptSignal(string msg)
    {
        Clients.Caller.acceptHubData("hi");
        Clients.All.acceptHubData("hi");
    }

}

不确定您使用的是哪个版本的SignalR,但在我的服务器上使用以下语法更成功:

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.All.acceptHubData("hello");    

在最新版本的SignalR中,您仍然可以使用
on
方法为JS客户端集线器方法调用添加事件,但是如果在调用
hubConnection.start()
之前未向
hubProxy
添加任何事件侦听器,您将无法订阅集线器。当
hubConnection
启动时,signer订阅您具有事件处理程序的集线器。如果未订阅中心,则在start()之后向该中心添加任何事件都将无效

如果在start()之前至少向中心添加一个事件侦听器,即使它不起任何作用,也可以在start()之后使用
on
向中心添加任何其他事件处理程序,然后将调用您的处理程序


在调用
start()
之前,是否使用
hubProxy.on('eventName',function(…
autogeneratedHubProxy.client.eventName=function(…
)添加事件并不重要,但只有
on
才会在
start()之后成功添加事件侦听器
被调用。

感谢您的回复-这确实有效-我想了解“开”事件原则不起作用的原因-请参阅我的编辑!您可能正在查看较旧版本的signalr的文档。当然,这是文档中推荐的方法:我正在查看此方法,非常棒-这确实有效-不会猜到的!我通过添加一个不存在的事件来测试它,这也有效!ThanksMan,我正在撕掉我的头发(我只剩下一点点了)试图找出我做错了什么。在调用start之前订阅似乎有点倒退,但显然这正是您需要做的。仅供参考-我使用的是
on()
方法,如果在
start()之后订阅,则无法工作
。我在网上搜索可能导致我的侦听器无法工作的原因,并发现了这一点。非常感谢!!在集线器连接启动之前添加一个虚拟事件处理程序被称为修复了它,即使所有其他事件处理程序都发生在启动之后。-MikeSee
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.All.acceptHubData("hello");    
myHub.client.acceptHubData = function (data) {
    console.log(data);
}