SignalR为同一用户打开新连接

时间:2012-10-12 09:54:47

标签: asp.net-mvc-3 signalr signalr-hub signalr.client

我是SignalR的新手并试图实现长时间运行的结果池。我已将JS添加到我的ASP.NET MVC应用程序并创建了bug类。

JS

  <script type="text/javascript">
        var message= $.connection.messageHub;
        $(function () {
            message.addMessage = function (htmlstring) {            
                alert(htmlstring);
            };

            $.connection.hub.start(function () {
                message.longRunningMethod('@HttpContext.Current.Session.SessionID');
            });        
        });
    </script>

c#c​​ode

[HubName("messageHub")]
public class MessagesHub : Hub
{
public void longRunningMethod(string sessionId)
{
   var repeatChecking = 0;
   while (repeatChecking < 3000000)
       {
          Caller.addMessage("Test");
          repeatChecking++;
          Thread.Sleep(TimeSpan.FromSeconds(1));                        
       }
}
}

代码工作正常,但有一个问题。每次相同的用户刷新网页时,都会创建新的Hub类并执行新的longRunningMethod方法。我想恢复连接并连接到同一个集线器实例并继续接收消息。任何人都可以解释如何实现这个吗?

1 个答案:

答案 0 :(得分:3)

非常频繁地创建和销毁集线器,因此永远不要放置任何您希望持续存在的数据(除非它是静态的)。

我不太确定你为什么要使用一个可以接收数据的长时间运行方法(因为SignalR总是处于启动状态并且可以接收/处理数据)但是你可以这样做:

查看SignalR股票代码示例(您可以通过Nuget将其拉入)。它创建一个单个实例类来启动计时器。该计时器用于向客户端广播数据。 https://github.com/SignalR/SignalR-StockTicker

您还可以查看ShootR。这是一款使用SignalR构建的多人游戏,其功能大致相同。创建一个后台计时器,充当服务器上的游戏循环,然后将数据向下推送到客户端。 https://github.com/NTaylorMullen/ShootR

最终,您的解决方案将涉及制作单件或静态计时器,作为“长期”运行方法。

希望这有帮助!