我让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(); // Won't work when I subscribe BEFORE starting connection
var proxy2 = connection2.createHubProxy('clientPushHub');
connection2.start();
proxy2.on('sendToClient', function (message) {
console.log('This will not work: ' + message);
});
如果我在开始proxy2
之前更改了connection2
订阅了pushToClient,那么它可以正常工作。还试着去做' on'在start()。done()回调中订阅但是没有用。
我已经下载并验证了this example按照我预期的连接后订阅的方式工作,而this ASP.NET article/section特别提到您可以按此顺序执行操作#39;使用生成的代理,我没有。
this SO question中对提问者有用的内容对我不起作用。
我可能出错的任何想法?
答案 0 :(得分:8)
基于此post,听起来你必须在调用start之前至少有一个事件监听器。从那里,您可以使用“on”功能添加更多事件处理程序。
编辑:
试试这个。
proxy2.on('foo',function(){});
connection2.start();
proxy2.on('sendToClient', function (message) {
console.log('This will not work: ' + message);
});
这也是您linked发表的文章:
注意:通常在调用start方法建立连接之前注册事件处理程序。如果要在建立连接后注册一些事件处理程序,则可以执行此操作,但在调用startmethod之前必须至少注册一个事件处理程序。这样做的一个原因是应用程序中可能有许多集线器,但如果您只使用其中一个集线器,则不希望在每个集线器上触发OnConnected事件。建立连接后,Hub代理上存在客户端方法会告诉SignalR触发OnConnected事件。如果在调用start方法之前没有注册任何事件处理程序,则可以调用Hub上的方法,但不会调用Hub'sOnConnected方法,也不会从服务器调用任何客户端方法。