正在创建聊天应用程序并希望向特定用户发送消息。 我可以向特定用户发送消息,但该消息也会显示给其他联系人。 示例: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);
}
}
答案 0 :(得分:0)
请先尝试调试 OnConnected,检查 Name 是否具有正确的值。您的客户是否有可能在收到索赔之前建立连接?
如果您将提供 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_>
你可以像这样调用客户端:
await Clients.User(receiver).broadcastMessage(Sender, message);
SignalR 已经知道哪个主体附加到哪个连接,因此可能不需要为每个用户创建组。