Как я могу отправить личное сообщение пользователю с помощью aspnet core SignalR?

#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