我们有一个SignalR客户端回调方法,当我们离开并回到它的包含页面时,会多次调用它。例如:page是salesUpdate.html(Angular模板),在第一次来这个页面时,回调将在它的事件发生一次。现在,当我们从这个页面移到另一个页面(比如purchaseUpdate.html),然后回到这个页面,即salesUpdate.html时,这个SignalR客户端回调方法将执行两次。当我们离开页面并返回它时,它将执行多次。从服务器,这个方法是从ASP.NET Web API调用的,并且Web API只被命中一次,所有后续执行的回调都没有访问Web API。 这是客户端回调方法:
var con;
var apiMsgProxy;
$(document).ready(function () {
con = $.hubConnection('http://localhost:51123/signalr');
apiMsgProxy = con.createHubProxy('salesHub');
apiMsgProxy.on('SendSaleUpdate', function (uMsg) {
console.log("Call back SendSaleUpdate called - " + uMsg);
});
con.start().done(function () {
console.log("SignalR connection opened - " + con.state);
}).fail(function () {
console.log('Could not Connect SignalR hub!');
});
});
任何指向此的指针都将非常感激。
答案 0 :(得分:2)
我知道很久以前就问过这个问题了。但我有同样的问题,并找到了解决方案。以为我会和大家分享。在问题中," salesHub"在页面加载时使用集线器的.on(" SendSaleUpdate")方法添加事件处理程序。显然,如果你不打算关掉"该处理程序将被SignalR调用为客户端插入集线器的时间(在相同的连接仍然打开的情况下访问同一页面。)为了防止这种情况发生,您需要调用集线器。当用户离开页面时关闭(" SendSaleUpdate")方法。这为我解决了同样的问题。
答案 1 :(得分:0)
这是一个古老的问题,但是由于我在我的案例中找到了解决方案,因此对其进行更新可能会有所帮助。因此,在我的情况下,由于apiMsgProxy是一个全局变量,因此每次刷新并重新加载页面时,它将每次都注册SendSaleUpdate函数,并且其注册次数将被调用多次