Asp.net mvc 4 signer避免在负载客户端重复登录

Asp.net mvc 4 signer避免在负载客户端重复登录,asp.net-mvc-4,signalr-hub,Asp.net Mvc 4,Signalr Hub,我正在使用信号机推送通知服务 我创建了一个局部视图。内部局部视图。这是我的客户端代码: <script type="text/javascript"> var objHub; $(function () { objHub = $.connection.AnilHub; loadClientMethods(objHub); $.co

我正在使用信号机推送通知服务

我创建了一个局部视图。内部局部视图。这是我的客户端代码:

    <script type="text/javascript">
            var objHub;
            $(function () {
                objHub = $.connection.AnilHub;

                loadClientMethods(objHub);

                $.connection.hub.start()
                    .done(function () { objHub.server.connect();
 console.log('Now connected, connection ID=' + $.connection.hub.id); }
// at the same time i want to insert into database to set user is online.

objHub.server.login('user1');
)
                    .fail(function () { console.log('Could not Connect!'); });


            function loadClientMethods(objHub) {

                objHub.client.getMessages = function (message) {
                    $('#divMessage').append('<div><p>' + message + '</p></div>');

                    var height = $('#divMessage')[0].scrollHeight;
                    $('#divMessage').scrollTop(height);
                }
            }
        </script>
现在我只想避免重新加载登录检查。因为每次我刷新页面时,它都会调用connect方法和hub方法。如何避免重新连接问题。我如何坚持这些事情,即使hub没有处理会话


请建议…

在html中,在第一次加载时,创建一个随机id并将其存储在cookie中

在集线器代码中,创建一个arraylist并将这些随机ID与相应的连接ID一起存储


在html中,尝试在每次页面刷新期间从Cookie中读取随机id,如果未找到,则为新连接,如果找到,则使用旧随机id和新连接id连接到集线器。然后,在hub arraylist中,对于这个特定的随机id,将旧的连接id替换为新的连接id。

如果数组未声明为静态,则此操作将不起作用。而且它无论如何也不能完全解决这个问题,因为一旦应用程序池被回收,阵列就会丢失,这种情况随时可能发生。大多数情况下都可以,但并不总是这样,不过可能已经足够好了。如果连接和/或信号服务器出现问题,我会使用javascript中的心跳函数重新登录,例如,我可以关闭信号服务器并等待几分钟,然后再打开它,几秒钟后,一切都恢复正常,当然,总的来说,它是有效的,我只是指出,你不能完全避免重新检查登录信息,这是OP中要求的,一般来说,这不是一件小事。
[HubName("MyHub")]
    public class MainHub : Hub
    {
 public void Connect()
        {
            try
            {
                string userGroup = "test";

                var id = Context.ConnectionId;

                Groups.Add(id, userGroup);

                Clients.Caller.onConnected(id, userGroup);
            }
            catch
            {
                Clients.Caller.NoExistAdmin();
            }
        }
 public void NotifyAllClients(string Message)
        {
            Clients.Group("test").getMessages(Message);
        }
public override Task OnConnected()
        {
            // Set status online on database

            return base.OnConnected();
        }

        public override Task OnDisconnected(bool stopCalled = false)
        {
            // set status disconnct in database
            return base.OnDisconnected(stopCalled);
        }
}
}