在启动与服务器的连接后,SignalR不使用"on"订阅

wil*_*lee 3 signalr

我让SignalR与Angular客户端一起工作,但proxy.on()如果在订阅事件之前建立连接,我就无法工作.

我的服务器方法pushToClient在两个集线器上调用客户端方法.

var connection1 = $.hubConnection(); //Works fine since I started connection AFTER subscribing
var proxy1 = connection1.createHubProxy('clientPushHub');
proxy1.on('sendToClient', function (message) {
    console.log('This will work: ' + message);
});
connection.start();

var connection2 = $.hubConnection(); // Doesn't work when I start the connection BEFORE subscribing
var proxy2 = connection2.createHubProxy('clientPushHub');
connection2.start();
proxy2.on('sendToClient', function (message) {
    console.log('This will not work: ' + message);
});
Run Code Online (Sandbox Code Playgroud)

如果我改变了事情,以便proxy2在开始之前订阅pushToClient connection2,它可以正常工作.还尝试在start().done()回调中执行'on'订阅,但这不起作用.

我已经下载并验证了这个示例连接订阅时的预期效果,并且这篇ASP.NET文章/部分明确提到如果不使用生成的代理,您可以按此顺序执行操作,我没有.

这个SO问题中对提问者有用的东西对我不起作用.

我可能出错的任何想法?

小智 8

根据这篇文章,听起来你必须在调用start之前至少有一个事件监听器.从那里,您可以使用"on"功能添加更多事件处理程序.

编辑:

试试这个.

proxy2.on('foo',function(){});
connection2.start();
proxy2.on('sendToClient', function (message) {
    console.log('This will not work: ' + message);
});
Run Code Online (Sandbox Code Playgroud)

这也是你链接到帖子的文章:

注意:通常在调用start方法之前注册事件处理程序以建立连接.如果要在建立连接后注册一些事件处理程序,则可以执行此操作,但在调用startmethod之前必须至少注册一个事件处理程序.这样做的一个原因是应用程序中可能有许多集线器,但如果您只使用其中一个集线器,则不希望在每个集线器上触发OnConnected事件.建立连接后,Hub代理上存在客户端方法会告诉SignalR触发OnConnected事件.如果在调用start方法之前未注册任何事件处理程序,则可以调用Hub上的方法,但不会调用Hub'sOnConnected方法,也不会从服务器调用任何客户端方法.