SignalR OnConnected多次调用

时间:2013-06-19 20:09:01

标签: asp.net-mvc-4 signalr signalr-hub

我有一个使用SignalR的asp.net mvc 4应用程序。

当用户连接时,我想通知所有人(暂时发送到“所有”只是为了测试它)。在我的Hub clas中我有这个:

    public override System.Threading.Tasks.Task OnConnected()
    {
        NotifyAllOfUserLogin(); 
        return base.OnConnected();
    }

在_layout.cshtml中,我有这个:

        <script type="text/javascript">
        $(document).ready(function () {
            var proxy = $.connection.messagehub;

            proxy.client.messageAll = function (message) {
                $('#messages').prepend('<p style=\'white-space:pre;\'>' + message + '</p><br />'); 
            };

            $("#btnSubmitMessage").click(function () {
                proxy.server.messageAll($("#txtMessage").val());
                $("#txtMessage").val('');
            });

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

虽然这有效,但我认为在母版页中写这个是错误的,因为集线器连接将为每个继承主页的页面重新初始化,因此OnConnected将被调用很多次。

我应该如何正确处理此问题,仅在用户登录应用程序时调用OnConnect,并在用户注销时调用onDisconnected?

1 个答案:

答案 0 :(得分:3)

对于每个页面加载,都会建立新连接。当该页面关闭时,类似于特定连接被关闭。

您要做的是在服务器端跟踪用户的连接ID。您需要跟踪与每个特定用户帐户相关的活动连接,以及断开连接时的活动连接。这样做,如果没有与该用户相关的预先存在的活动连接ID,您可以通知所有用户该连接的人。