【问题标题】:Signalr Personal ChatSignalr 个人聊天
【发布时间】:2019-02-23 13:32:30
【问题描述】:

我还是 signalr 的新手。我想用signalR 制作聊天应用程序,但个人聊天和群组有问题,因为每次用户重新连接时连接ID 总是会改变。

问题:我们如何知道哪个 id 用户引用了特定用户。如果连接ID总是改变。 (因为如果用户在浏览器中打开另一个选项卡,signalR 会将他们识别为另一个用户。我们如何知道 id 是同一个人)

signalR 中是否有任何独特的属性可以保存在数据库中,以便用户登录时可以识别用户?

【问题讨论】:

    标签: signalr


    【解决方案1】:

    您可以使用已登录用户的UserNames。根据您使用的技术,您可以使用不同的方法。我在 MVC 中的做法如下:
    枢纽:

     public class ChatHub :Hub
        {
            public void SendMessage(string sender,string receiver, string msg)
            {
                MessageService messageService = new MessageService();
                long msgId = messageService.Add(sender, receiver, msg);
                Clients.User(receiver).receiveMessage(sender, msg, msgId);
                Clients.User(sender).receiveMessage(sender, msg, msgId);
            }
        }
    

    查看:

       $('#send').click(function () {
            hub.invoke("SendMessage", "@User.Identity.Name", "@ViewBag.Receiver", $('#message').val());
        });
    

    发送者用户名可以通过@User.Identity.Name(在MVC中)获取,接收者用户名可以在发送者打开接收者聊天时读取。

    更新
    关于 Asp.Net Web Forms,请检查以下是否有帮助:
    SignalR-with-ASP-NET-One-to-one-and-Group-Chat

    【讨论】:

    • 你的意思是 IUserID 提供者?因为我不明白如何使用它
    • 如果我不使用 mvc。有什么办法吗,先生?我使用普通 webform(.aspxfile)(对不起,我也不知道我是用户的技术名称)
    • 感谢先生提出我的问题。从现在开始,我开始意识到这一点。我想使用 Clients.User("userName").someMethodinClient。但我不知道如何在客户端设置 userName 值(可能在 js 脚本中(我不确切知道))所以当服务器 Clients.User("userName").someMethodinClient 来自客户端时,服务器将知道必须调用哪个客户端。
    【解决方案2】:

    SignalR 在每次连接/重新连接时都在做它应该做的事情。您的用户正在建立一个新的连接,因此他们将获得一个新的连接 ID。

    如果他们在新选项卡中打开将创建一个新连接。您必须确定当前正在连接的用户以及您希望如何处理。

    如果您查看docs,您会发现他们提供了将用户映射到连接的示例。

    【讨论】:

    • 我不明白我应该把代码放在哪里(公共接口 IUserIdProvider)。以及我们如何从客户端设置 id
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 2012-05-06
    相关资源
    最近更新 更多