如何使用 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, "&").replace(/</g, "<").replace(/>/g, ">");
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, "&").replace(/</g, "<").replace(/>/g, ">");
var encodedMsg = user + " says " + msg + " by " + targetConnectionId;
var li = document.createElement("li");
li.textContent = encodedMsg;
document.getElementById("messagesList").appendChild(li);
});
Screenshots of Test
我创建了一个项目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, "&").replace(/</g, "<").replace(/>/g, ">");
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, "&").replace(/</g, "<").replace(/>/g, ">");
var encodedMsg = user + " says " + msg + " by " + targetConnectionId;
var li = document.createElement("li");
li.textContent = encodedMsg;
document.getElementById("messagesList").appendChild(li);
});
Screenshots of Test