如何使用signalR保持特定页面查看的实时计数器?

时间:2014-09-22 14:03:22

标签: asp.net-mvc signalr

我正在创建一个应用程序功能,它可以实时查看正在查看特定页面的用户数。

到目前为止,我能够实现的是,我可以计算整个网站的会话数量,这很好,但我希望能够保持用户数量的计数正在查看特定页面。

我遇到的另一个问题是计数是浏览器会话,这意味着如果我有几个标签打开同一页面,那么计数将增加标签的数量。我如何才能唯一地识别每个用户?

C#:

public class View : Hub
    {
        public static int SiteSessionCount;

        public void ViewerCountChanged(int viewerCount)
        {
            Clients.All.viewerCountChanged(viewerCount);
        }

        public override Task OnConnected()
        {

            Interlocked.Increment(ref SiteSessionCount);
            ViewerCountChanged(SiteSessionCount);

            return base.OnConnected();
        }

        public override Task OnDisconnected()
        {
            Interlocked.Decrement(ref SiteSessionCount);
            ViewerCountChanged(SiteSessionCount);

            return base.OnDisconnected();
        }
    }

使用Javascript:

<script src="/Scripts/jquery.signalR-1.1.4.js"></script>
        <script src="/signalr/hubs"></script>
        <script>

            var hubProxy = $.connection.view;

            hubProxy.client.viewerCountChanged = function (count) {
                $("#siteSessionsCount").text(count);
            };

            $.connection.hub.start();
        </script>

1 个答案:

答案 0 :(得分:0)

您需要向SignalR Hub发送用户的唯一标识符。这样,即使他/她在浏览器中有多个标签打开到某个页面,您也不会将其更新为视图。使用SignalR,每次打开选项卡并连接到站点时,它将生成唯一的连接ID。它不知道或不关心你有5个标签打开同一页面。在我看来,你必须允许更新计数,但同时能够过滤掉运行多个标签的同一用户。