信号器2推送无法单页应用程序

时间:2017-02-03 00:52:14

标签: signalr

这是一个带有角度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);
        }
    }
}

仅供参考,每当我访问该页面时,客户端代码都会执行。 谁能告诉我我做错了什么?

3 个答案:

答案 0 :(得分:1)

您可以尝试使用

File[] files = (File[]) selectedFiles.values().toArray();

查看详细信息和其他选项here

答案 1 :(得分:0)

最后,我想出了一个随机尝试不同选项的解决方案。在url更改事件时,在移动到另一个页面时,我调用了$ .connection.hub.stop()方法来解决问题。

由于在加载此html页面时调用了start(),因此在移动到另一个URL时没有停止。当我回到这个页面时,它再次连接。这可能是问题,虽然没有记录虽然连接ID保持不变但多次调用start()方法会搞砸。移出另一个网址时调用stop方法确实很有效!

非常感谢你们的帮助和时间。

答案 2 :(得分:0)

我建议在服务中抽象出信号器的东西。因此,您可以在启动时处理一次,并将事件从服务器转发到活动控制器。 你可以实现类似观察者模式的东西。在创建控制器时从您的信号服务器订阅事件,在解构时取消订阅。

现有的angularjs signalR模块还有一个可能的解决方案: https://github.com/JustMaier/angular-signalr-hub