这是一个带有角度js和web api的单页面应用程序。我在调用方法server.CheckIfRunning()的页面上实现了signalr,它检查后台进程是否正在运行并将消息推送到客户端。当我第一次访问该页面时,我成功收到通知。但是当我导航到另一个页面并再次返回时,该页面正确调用server.CheckIfProcessRunning(),服务器也会推送到客户端。但是,客户端没有收到通知。
客户端代码:
var hub = $.connection.tRAHub;
hub.client.NotifyAlreadyRunning = function (message) {
$scope.$apply(function () {
$scope.status=message;
});
};
$.connection.hub.start()
.done(function () {
hub.server.checkIfRunning($.connection.hub.id);
});
服务器端代码:
public class TRAHub : Hub
{
public void CheckIfRunning(string id)
{
var isRunning = CheckIfProcessRunning();//this method checks if the process is running. code not shown
if (isRunning)
{
var client = Clients.Client(id);
client.NotifyAlreadyRunning(id);
}
}
}
仅供参考,每当我访问该页面时,客户端代码都会执行。 谁能告诉我我做错了什么?
答案 0 :(得分:1)
答案 1 :(得分:0)
最后,我想出了一个随机尝试不同选项的解决方案。在url更改事件时,在移动到另一个页面时,我调用了$ .connection.hub.stop()方法来解决问题。
由于在加载此html页面时调用了start(),因此在移动到另一个URL时没有停止。当我回到这个页面时,它再次连接。这可能是问题,虽然没有记录虽然连接ID保持不变但多次调用start()方法会搞砸。移出另一个网址时调用stop方法确实很有效!
非常感谢你们的帮助和时间。
答案 2 :(得分:0)
我建议在服务中抽象出信号器的东西。因此,您可以在启动时处理一次,并将事件从服务器转发到活动控制器。 你可以实现类似观察者模式的东西。在创建控制器时从您的信号服务器订阅事件,在解构时取消订阅。
现有的angularjs signalR模块还有一个可能的解决方案: https://github.com/JustMaier/angular-signalr-hub