SignalR 客户端回调方法被多次调用

vik*_*ing 6 jquery signalr angularjs signalr.client asp.net-web-api2

我们有一个 SignalR 客户端回调方法,当我们离开和回到它的包含页面时,它会被多次调用。例如:页面是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!'); 
        });
});
Run Code Online (Sandbox Code Playgroud)

任何指向此的指针将不胜感激。

Ale*_*lex 8

我知道这个问题很久以前就有人问过了。但是我遇到了同样的问题并找到了解决方案。以为我会与大家分享。在这个问题中,“salesHub”被初始化,并且在页面加载时使用集线器的 .on("SendSaleUpdate") 方法添加事件处理程序。显然,如果您不“关闭”该处理程序,SignalR 将在客户端启动集线器时多次调用它(在同一连接仍处于打开状态时访问同一页面)。为了防止这种情况发生,您当用户离开页面时需要调用 hub 的 .off("SendSaleUpdate") 方法。这为我解决了同样的问题。