#signalr #signalr-hub #signalr.client #asp.net-core-signalr #signalr-2
#signalr #signalr-концентратор #signalr.client #asp.net-core-signalr #signalr-2
Вопрос:
Я создал проект x и не вижу, где ошибка. Все работает, но личное сообщение не работает. Ссылка ниже — это мой пример проекта. В моем реальном проекте есть функция, называемая connectionToken в контексте на клиенте. Как я могу получить значение connectionToken или почему оно там?
** Я использую объединительную плату Redis в моем реальном примере проекта ссылка на проект:https://github.com/fdevGit/SignalRExample
Ответ №1:
Из предоставленного вами кода используйте Clients.User()
not 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", 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(/amp;/g, "amp;amp;").replace(/</g, "amp;<").replace(/>/g, "amp;>");
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(/amp;/g, "amp;amp;").replace(/</g, "amp;<").replace(/>/g, "amp;>");
var encodedMsg = user " says " msg " by " targetConnectionId;
var li = document.createElement("li");
li.textContent = encodedMsg;
document.getElementById("messagesList").appendChild(li);
});
Скриншоты теста
Комментарии:
1. В моем реальном проекте есть функция, называемая connectionToken в контексте на клиенте. Как я могу получить значение connectionToken или почему оно там?
2. Токен подключения — это зашифрованная строка, содержащая идентификатор подключения и, если доступно, имя пользователя. Его необходимо отправлять с каждым http-запросом, отправляемым клиентом на сервер. Если сервер получает запрос без маркера подключения или если он не может расшифровать маркер подключения, он отклонит запрос. Чтобы узнать больше о маркере подключения и о том, как это работает, взгляните на эту статью. learn.microsoft.com/en-us/aspnet/signalr/overview/security /…
3. SignalR передает токен подключения как значение строки запроса, а не как файл cookie. Хранение токена подключения в файле cookie небезопасно, поскольку браузер может непреднамеренно переслать токен подключения при обнаружении вредоносного кода. Кроме того, передача токена соединения в строке запроса предотвращает сохранение токена соединения за пределами текущего соединения.
4. Вот ссылка о том, как получить [токен]. github.com/SignalR/SignalR/issues/3415