Signalr 信号器2推送单页应用程序失败

Signalr 信号器2推送单页应用程序失败,signalr,Signalr,这是一个带有angular js和web api的单页应用程序。我在调用方法server.CheckIfRunning()的页面上实现了signer,该方法检查后台进程是否正在运行,并将消息推送到客户端。当我第一次进入该页面时,我成功地收到了通知。但是,当我导航到另一个页面并再次返回时,该页面会正确地调用服务器。但是,客户端没有收到通知 客户端代码: var hub = $.connection.tRAHub; hub.client.NotifyAlreadyRunning = func

这是一个带有angular js和web api的单页应用程序。我在调用方法server.CheckIfRunning()的页面上实现了signer,该方法检查后台进程是否正在运行,并将消息推送到客户端。当我第一次进入该页面时,我成功地收到了通知。但是,当我导航到另一个页面并再次返回时,该页面会正确地调用服务器。但是,客户端没有收到通知

客户端代码:

  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);
        }
    }
}
服务器端代码:

  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);
        }
    }
}
仅供参考,每当我转到该页面时,客户端代码都会执行。 谁能告诉我我做错了什么吗?

你可以试着用

Clients.Caller.NotifyAlreadyRunning(id);

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

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

由于它在加载此html页面时调用start(),因此在移动到另一个url时没有停止。当我回到这个页面时,它再次连接。这可能就是问题所在,尽管没有记录多次调用start()方法会导致连接id保持不变。当移动到另一个url时调用stop方法就完成了这个把戏


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

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

还有一种可能的解决方案,即现有的angularjs信号器模块:

您能否覆盖服务器端和客户端上的OnConnected和OnDisconnected事件,以确保客户端没有错误地断开连接?顺便说一下,您可以启用
EnableDetailedErrors
,查看客户端是否存在异常。谢谢cassandrad。我在服务器上尝试了onconnected和unconnected两种方法,它们似乎工作得很好。它连接。当我导航到另一个视图时,它不会关闭。但当我回到这一观点时,它又联系了起来。这会引起麻烦吗?我应该从视图中断开ehile吗?我将尝试在客户端实现这些事件,并启用enabledetailederrors以查看是否可以找到某些内容。DDan,这没有帮助。我想问题在于我订阅信号器的角度控制器上的事件。第一次正常工作时。当我转到另一个url,然后返回页面时,它再次订阅,并调用CheckIfRunning()方法。然后,服务器还正确调用NotifyAlreadyRunning()。但客户没有意识到这一点。但是,如果我刷新页面(F5),它会再次工作。我想当我离开页面并再次返回时,需要刷新以重置订阅。您的连接id仍然相同吗?我想不是。是的。连接id相同。因为它是一个单页应用程序,所以不会刷新。并且连接id保持不变。当我点击F5时,它连接了一个新的id。当他们实现SignalR for JS时,可能没有想到单页应用程序。一个简单的方法是在你再次回到页面时重新连接。