SignalR jquery 会话存储

Posted

技术标签:

【中文标题】SignalR jquery 会话存储【英文标题】:SignalR jquery sessionstorage 【发布时间】:2017-10-30 22:04:12 【问题描述】:

我在https://docs.microsoft.com/en-us/aspnet/signalr/overview/getting-started/tutorial-getting-started-with-signalr 的帮助下建立了一个实时聊天

现在我遇到了无法使用 sessionStorage 保存用户名的问题,因此用户不必在每次进入网站上的聊天站点时都输入用户名。

这是我第一次使用 Web 应用程序和 sessionStorage。

希望有人可以帮助我:)

在线查看:http://chat.kibshede.dk/Chat.aspx

我有一堂课,里面有这个: 命名空间 SignalRChat 公共类 ChatHub : 集线器 公共无效发送(字符串名称,字符串消息) // 调用broadcastMessage 方法更新客户端。 Clients.All.broadcastMessage(name, message);

和一个 Owin 类:

命名空间 SignalRChat 公共类启动 公共无效配置(IAppBuilder 应用程序) //任何连接或集线器接线和配置都应该在这里 app.MapSignalR();

<!--Reference the autogenerated SignalR hub script. -->
    <script src="signalr/hubs"></script>
    <!--Add script to update the page and send messages.-->
    <script type="text/javascript">
        $(function () 
            // Declare a proxy to reference the hub.
            var chat = $.connection.chatHub;
            // Create a function that the hub can call to broadcast messages.
            chat.client.broadcastMessage = function (name, message) 
                // html encode display name and message.
                var encodedName = $('<div />').text(name).html();
                var encodedMsg = $('<div />').text(message).html();
                // Add the message to the page.
                $('#discussion').append('<li><strong>' + encodedName
                    + '</strong>:&nbsp;&nbsp;' + encodedMsg + '</li>');
            ;

            if (sessionStorage.getItem('UserName') != '#ContentPlaceHolder1_displayname') 
                // Get the user name and store it to prepend to messages.
                var UserName = prompt('Enter your name:', '').toString();
                sessionStorage.setItem('UserName', UserName);
            



            // Set initial focus to message input box.
            $('#ContentPlaceHolder1_message').focus();

            // Start the connection.
            $.connection.hub.start().done(function () 
                $('#sendmessage').click(function () 
                    // Call the Send method on the hub.
                    chat.server.send(sessionStorage.getItem('UserName'), $('#ContentPlaceHolder1_message').val());
                    // Clear text box and reset focus for next comment.
                    $('#ContentPlaceHolder1_message').val('').focus();
                );
            );
        );
    </script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
<asp:Panel ID="Panel_ChatContainer" CssClass="container" runat="server">

        <asp:Panel ID="Panel_ChatContainer_Chat" runat="server">
            <asp:TextBox ID="message" runat="server"></asp:TextBox>
            <input type="button" id="sendmessage" value="Send" />
            <asp:Label ID="displayname" runat="server"></asp:Label>
            <ul id="discussion"></ul>
        </asp:Panel>

    </asp:Panel>

【问题讨论】:

您的用户是否必须登录您的网站?如果是这样,您可以使用他们现有的会话 cookie。 我不使用登录:/ 【参考方案1】:

您需要将 sessionStorage 更改为 localStorage 以保留用户设置的用户名。 sessionStorage 数据只持续到用户关闭选项卡,而 localStorage 将持续存在。

【讨论】:

但是我不能使用 sessionStorage 来保存用户名吗?无论如何我都在登录中使用会话 您可以将他们输入的内容保存在您用来为您的用户记录会话 ID 的任何对象中,但如果您愿意,他们不必在每次导航到您的网站时都输入用户名您需要在用户端持续存在的东西。你应该在你的 OnConnect / OnDisconnect 覆盖的代码中放置一个断点,如果你在你的应用中导航,看看它们被调用的频率。 我一直在尝试将用户名保存在会话存储中并创建了一个“如果”但由于某种原因会话或其他地方无法正常工作 if (sessionStorage.getItem('UserName') != '# ContentPlaceHolder1_displayname') var UserName = prompt('输入你的名字:', '').toString(); sessionStorage.setItem('用户名', 用户名); 对不起,我完全错过了。我编辑了我的答案。

以上是关于SignalR jquery 会话存储的主要内容,如果未能解决你的问题,请参考以下文章

如何在服务器端 Blazor 中存储会话数据

如何让 SignalR 连接尊重会话超时

使用 window 对象进行会话存储而不是 AmplifyJS 存储

将 ASP.NET 会话传递给 jQuery

Jquery Ajax 发布以更新视图中的 django 会话

jQuery cookie 是不是可以像会话变量一样过期?