Как отправить сообщение конкретному пользователю с помощью signalR

у меня есть некоторые проблемы с signalR, я не могу отправить сообщение конкретному пользователю из концентратора.

Я хочу сделать так:

public void Send(string userToId, string userForId, string message)
{

    IHubContext context = GlobalHost.ConnectionManager.GetHubContext<ChatHubs>();

    //userForId - it is Session["UserId"]
    context.Clients.User(userForId).updateMessages(message);
}

Я уже читал эту тему:http://www.asp.net/signalr/overview/guide-to-the-api/mapping-users-to-connections, но это не ясно для меня, потому что у меня нет этого var name = Context.User.Identity.Name; У меня есть информация о пользователе в переменной сеанса и второй, когда я получаю connectionId следующим образом:var myClientId = $.connection.hub.id; connectionId-изменяется при обновлении страница или когда я нажимаю другое меню в своем проекте.

у меня есть несколько вопросов: 1) могу ли я отправить сообщение конкретному пользователю без connectionId (используйте только сеанс["UserId"])? 2) В общем, как я могу легко сделать обмен сообщениями один к одному с SignalR ?

P.S. Я работаю ASP.NET MVC (C#)

2 ответов


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

SignalR дает уникальный идентификатор каждому клиенту в качестве идентификатора соединения. Можно использовать этот идентификатор подключения или назначить уникальный идентификатор клиенту при создании клиента и использовать его в качестве идентификатора подключения. это зависит от вас, что вы хотите использовать.

редактировать

просто обновите свой метод в Файл Класса Концентратора.....

     public void Send(string name, string message, string connectionid)
{
    // Call the addNewMessageToPage method to update clients.
    Clients.All.addNewMessageToPage(name, message, connectionid);
}

и на стороне клиента вы можете обновить добавить код после включения файлов SignalR: -

        var chat = $.connection.chatHub;


             chat.client.addNewMessageToPage = function (name, message, connectionid) {
            if (connectionid == $('#connection').val()) {

               //   Do What You want Here...
            };
        };
        // Get the user name and store it to prepend to messages.
        $('#displayname').val(prompt('Enter your name:', ''));
        $('#connection').val(prompt('Enter your ID:', ''));

        // Set initial focus to message input box.
        $('#message').focus();
        // Start the connection.
        $.connection.hub.start().done(function () {
            $('#sendmessage').click(function () {
                // Call the Send method on the hub.
                chat.server.send($('#displayname').val(), $('#message').val(), $('#connection').val());
                // Clear text box and reset focus for next comment.
                $('#message').val('').focus();
            });
        });

Надеюсь, Это Поможет...


Если вы хотите отправить сообщение конкретному пользователю в SignalR, самый простой способ-использовать аутентификацию формы. Также можно использовать пользовательский сеанс с проверкой подлинности формы. Сразу после создания кода сеанса поместите этот код.

FormsAuthentication.SetAuthCookie(username.Trim(), false);

затем в signalR вы можете использовать эту строку для отправки сообщения этому пользователю:

var username = Context.User.Identity.Name;
context.Clients.User(username).updateMessages(message);

EDIT:

на вопрос имя этого метода (имя получателя) и push-сообщения для этого пользователя.Тогда ты не нужно давать userForId, потому что у вас уже есть имя отправителя с "VAR username = Context.Пользователь.Личность.Имя;".Также Этот метод будет просто нажать на метод, что имя пользователя получателя. Если вы хотите получить также сообщение отправителю, вам нужно пользователь "Caller", и вам нужна новая функция записи, чтобы получить сообщения вызывающего абонента в javascript.Надеюсь, вам все ясно.

public void Send(string username, string message)
{
    context.Clients.Caller.updateMessagesCaller(message);
    context.Clients.User(username).updateMessages(message);
}

это сообщение будет идти только это имя пользователя.И моя рекомендация - использовать реализацию FormAuthentication в целом проект.Спасибо.