【问题标题】:How Can I Send Message To specific User with signalR如何使用 signalR 向特定用户发送消息
【发布时间】:2015-04-27 00:39:55
【问题描述】:

signalR 有问题,我无法从 Hub 向特定用户发送消息。

我想这样做:

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 进行一对一的消息传递?

附注我正在使用 ASP.NET MVC (C#)

【问题讨论】:

  • 你可以看看this answer。但是,它没有使用 Session,而是解释了如何插入自定义用户 ID。

标签: c# asp.net-mvc asp.net-mvc-4 signalr messaging


【解决方案1】:

您可以向所有没有连接 ID 的用户发送广播消息。您只需为每个用户分配一个唯一 ID 并将其作为消息参数发送。

SignalR 为每个客户端提供一个唯一 ID 作为连接 ID。您可以使用该连接 ID,也可以在创建客户端时为客户端分配唯一 ID 并将其用作连接 ID。这取决于你想使用什么。

编辑

只需在 Hub 类文件中更新您的方法.....

     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 唯一 ID 以及如何将其与自定义应用程序 User (Session["User"]) 匹配,请给我代码示例。
  • @yash 请编辑您的答案以包含代码示例。外部链接有丢失的习惯。
  • 我认为,这个解决方案有一些不利的一面,如果你有大约 1000 个客户端在线,当一个用户向另一个用户发送消息时,集线器总是调用所有 1000 个用户的函数并检查 ConnectionId:chat.client。 addNewMessageToPage = function (name, message, connectionid) { if (connectionid == $('#connection').val()) { // 在这里做你想做的事... };你有解决这个问题的想法吗?
  • 这种变通方法不是好的解决方案。因为正如@AvtandilKavrelishvili 所说,您总是向所有客户发送消息。这对 SignalR 和服务器来说是不必要的努力。
  • 如前所述,这是个非常糟糕的主意。
【解决方案2】:

如果您想在 SignalR 中向特定用户发送消息,最简单的方法是使用表单身份验证。您也可以将自定义会话与表单身份验证一起使用。在创建您的会话代码后立即放置此代码。

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

然后在 signalR 中,您可以使用此行向该用户发送消息:

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

编辑:

对于您的问题,将用户名传递给此方法(接收者用户名)并将消息推送给该用户。然后您不需要提供 userForId,因为您已经拥有带有“var username = Context.User.Identity.Name; “。此外,此方法只会推送到接收者用户名的方法。如果您还想向发件人发送消息,您需要用户“来电者”,并且您需要编写一个新函数来在 javascript 中获取来电者消息。我希望它对您来说很清楚。

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

此消息只会发送到该用户名。我的建议是在您的整个项目中使用 FormAuthentication 实现。谢谢。

【讨论】:

  • 感谢您的回答。我尝试将我的解决方案修改为 FormAuthentication 并且我已经完成了。当我使用这个 - var username = Context.User.Identity.Name;在集线器中,它得到我的用户名,但我需要其他用户用户名才能发送消息。
  • 我为你的问题编辑了我的答案。请看一下
  • 在我的 Hub context.Clients.Client(connectionId).updateMessages(result);不工作,我像这样从客户端获取connectionId: $.connection.hub.id;有人可以帮我吗?
  • 假设我想向 foo 发送消息,但是当这段代码运行 Context.User.Identity.Name 时,它会给出我的名字,那么这行代码如何向 foo context.Clients.User(username).updateMessages(message); 发送消息?请帮助我理解。谢谢
  • 这里的上下文是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
相关资源
最近更新 更多