如何使用aspnet核心SignalR向用户发送私人消息?

问题描述

我创建了一个项目x,但看不到错误在哪里。一切正常,但是私人消息不起作用。下面的链接是我的示例项目。在我的真实项目中,客户端的上下文中有一个名为connectionToken的功能。如何获取connectionToken值或为什么存在该值?

**我在真实项目中使用Redis背板 项目链接示例:https://github.com/fdevGit/SignalRExample

解决方法

从您提供的代码中,使用Clients.User()而不是Clients.Client()

Clients.User(...)获取用户标识符。您的参数是connectionId,这是一个不同的概念,已与Clients.Client(...)一起使用。

    public async Task SendMessageToUser(string user,string targetConnectionId,string message)
    {
        Console.WriteLine($"{Context.ConnectionId}-{targetConnectionId}-{message}");
        
        //await Clients.User(...)
        await Clients.Client(targetConnectionId).SendAsync("ReceiveMessageToUser",user,targetConnectionId,message);
    }






关于callback method的名称还有其他建议。在SendAsync()中返回不同的方法名称。

   public async Task SendMessageToMe(string user,string message)
    {
        Console.WriteLine($"{Context.ConnectionId}-Caller-{message}");
        await Clients.Caller.SendAsync("ReceiveMessageToMe",message);
    }
    public async Task SendMessageToUser(string user,string message)
    {
        Console.WriteLine($"{Context.ConnectionId}-{targetConnectionId}-{message}");
        await Clients.Client(targetConnectionId).SendAsync("ReceiveMessageToUser",message);
    }

char.js中的更改

connection.on("ReceiveMessageToMe",function (user,message) {
    var msg = message.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");
    var encodedMsg = user + " says " + msg;
    var li = document.createElement("li");
    li.textContent = encodedMsg;
    document.getElementById("messagesList").appendChild(li);
});

connection.on("ReceiveMessageToUser","&gt;");
    var encodedMsg = user + " says " + msg + " by " + targetConnectionId;
    var li = document.createElement("li");
    li.textContent = encodedMsg;
    document.getElementById("messagesList").appendChild(li);
});

测试屏幕截图

enter image description here