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

How can I send a private message to a user with aspnet core SignalR?

我创建了一个项目x,看不出哪里出错了。一切正常,但私信不起作用。下面的 link 是我的示例项目。在我的真实项目中,客户端上下文中有一个名为 connectionToken 的功能。我怎样才能获得 connectionToken 值或它为什么在那里?

**我在实际项目中使用Redis背板 示例项目 link: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的名字还有一个建议。 Return SendAsync() 中的不同方法名称。

   public async Task SendMessageToMe(string user, string message)
    {
        Console.WriteLine($"{Context.ConnectionId}-Caller-{message}");
        await Clients.Caller.SendAsync("ReceiveMessageToMe", user, message);
    }
    public async Task SendMessageToUser(string user, string targetConnectionId, string message)
    {
        Console.WriteLine($"{Context.ConnectionId}-{targetConnectionId}-{message}");
        await Clients.Client(targetConnectionId).SendAsync("ReceiveMessageToUser", user, targetConnectionId, 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", function (user, targetConnectionId, message) {
    var msg = message.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
    var encodedMsg = user + " says " + msg + " by " + targetConnectionId;
    var li = document.createElement("li");
    li.textContent = encodedMsg;
    document.getElementById("messagesList").appendChild(li);
});

Screenshots of Test