向特定用户 SignalR 发送消息

时间:2021-03-31 09:29:43

标签: signalr

正在创建聊天应用程序并希望向特定用户发送消息。 我可以向特定用户发送消息,但该消息也会显示给其他联系人。 示例:Dev 正在向 Josh 发送消息

开发人员向乔希发送“你好”

Josh 的联系人为

  • 阿米特
  • 丽塔
  • 开发

和 josh 现在说话 Amit 当时出现的 Dev 消息是 Amit chat Screen

This is my ChatHub.cs---------
    public void Send(string receiver, string message)
    {
       
            if (receiver != string.Empty && message != string.Empty)
            {
                string Sender = Context.User.Identity.Name;

                Clients.Group(receiver).broadcastMessage(Sender, message);
                Clients.Group(Sender).broadcastMessage(Sender, message);

                ChatRepository CR = new ChatRepository();
                CR.SaveConversation(Sender, receiver, message);
            }
    }

    public override Task OnConnected()
    {
        string name = Context.User.Identity.Name;
        Groups.Add(Context.ConnectionId, name);

        return base.OnConnected();
    }

请帮助我找不到解决方案 谢谢

编辑:我向特定用户发送消息的方法请按照评论中的讨论进行检查

 public void Send(string receiver, string message)
    {

        if (receiver != string.Empty && message != string.Empty)
        {
            string Sender = Context.User.Identity.Name;

            if ("Success" == CR.CheckingForConnetionBetweenUser(receiver, Sender))  //Checking connectivity from a XYZTable 
            {                                                                //"Success" value from DB shows users are connected to each other 
                Clients.Group(receiver).broadcastMessage(Sender, message);
            }
            Clients.Group(Sender).broadcastMessage(Sender, message);


            CR.SaveConversation(Sender, receiver, message);
        }
    }

1 个答案:

答案 0 :(得分:0)

请先尝试调试 OnConnected,检查 Name 是否具有正确的值。您的客户是否有可能在收到索赔之前建立连接?

另外,请看一下这篇文章。 https://docs.microsoft.com/en-us/aspnet/core/signalr/authn-and-authz?view=aspnetcore-5.0#use-claims-to-customize-identity-handling

如果您将提供 IUserIdProvider 服务以返回 Name 声明,或者如果您将 userId 映射到您的登录代码中的 ClaimTypes.NameIdentifier 声明,您将能够使用以下方法过滤您的 SignalR 客户端:https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.signalr.ihubclients-1.user?view=aspnetcore-5.0#Microsoft_AspNetCore_SignalR_IHubClients_1_User_System_String_

参考的默认实现:https://github.com/aspnet/SignalR/blob/master/src/Microsoft.AspNetCore.SignalR.Core/DefaultUserIdProvider.cs

你可以像这样调用客户端:

await Clients.User(receiver).broadcastMessage(Sender, message);

SignalR 已经知道哪个主体附加到哪个连接,因此可能不需要为每个用户创建组。