MVC CORE SignalR отправлять сообщения только конкретному пользователю - PullRequest
0 голосов
/ 04 мая 2019

Я использую SignalR Core и ASPNET Core 2.2 и пытаюсь отправить сообщение одному пользователю. для всех пользователей работает нормально. Csharp код

[HubMethodName("SendMessageToUser")]
public Task DirectMessage(string user, string message)
{
  //eg.user = abcd@gmail.com
  return Clients.User(user).SendAsync("ReceiveMessage", message);
}

код JS

connection.on("ReceiveMessage", 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);
});

1 Ответ

0 голосов
/ 08 мая 2019

Вы можете отправить сообщение конкретному пользователю, используя его идентификатор соединения, поэтому мне нужно создать такой концентратор.GetConnectionId вернет идентификатор подключения этого пользователя, когда он подключится к сигнальному концентратору

   public class ConnectionHub : Hub
        {
            public async Task Send(string userId)
            {
                var message = $"Send message to you with user id {userId}";
                await Clients.Client(userId).SendAsync("ReceiveMessage", message);
            }

            public string GetConnectionId()
            {
                return Context.ConnectionId;
            }
        }

Затем в файле startup.cs

services.AddSignalR();
app.UseSignalR(routes =>
{
  routes.MapHub<ConnectionHub>("/connectionHub");
});

Затем код на стороне клиента

(function () {
        var connection = new signalR.HubConnectionBuilder().withUrl("/connectionHub").build();

        connection.start().then(function () {
            console.log("connected");

            connection.invoke('getConnectionId')
                .then(function (connectionId) {
                    sessionStorage.setItem('conectionId', connectionId);
                    // Send the connectionId to controller
                }).catch(err => console.error(err.toString()));;


        });

        $("#sendmessage").click(function () {
            var connectionId = sessionStorage.getItem('conectionId');
            connection.invoke("Send", connectionId);
        });

        connection.on("ReceiveMessage", function (message) {
            console.log(message);
        });

    })();

Сначала я вызываю getConnectionId в хабе, чтобы получить идентификатор подключения пользователя, затем я могу отправить сообщение конкретному пользователю, используя его идентификатор подключения.

Надеюсь, что помощь

...