0

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

当用户连接时,我想通知所有人(暂时发送给“所有人”以进行测试)。在我的 Hub 类中,我有这个:

    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?

4

1 回答 1

3

对于每个页面加载,都会建立一个新连接。当该页面关闭时,该特定连接也同样关闭。

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

于 2013-06-19T20:59:25.547 回答