【问题标题】:Want to send message to only connected client SignalR想要仅向连接的客户端 SignalR 发送消息
【发布时间】:2014-10-06 06:52:48
【问题描述】:

这里我得到了信号器的位代码并包含在内。

客户端代码

$(function () {
    // Proxy created on the fly
    var chat = $.connection.chat;

    // Declare a function on the chat hub so the server can invoke it
    chat.addMessage = function (message) {
        $('#messages').append('<li>' + message + '');
    };

    $("#broadcast").click(function () {
        // Call the chat method on the server
        chat.send($('#msg').val());
    });

    // Start the connection
    $.connection.hub.start();
});

服务器代码

public class Chat : Hub
{
    public void Send(string message)
    {
        // Call the addMessage method on all clients
        Clients.addMessage(message);
    }
}

只需看到这一行Clients.addMessage(message); addMessage() 将在客户端调用 addMessage() 函数,但假设当我向特定客户端发送数据或消息时,如果客户端不再连接,那么会发生什么?

信号器中是否有任何规定,例如我们可以在将数据传递给特定客户端之前确定客户端已连接。

我想在向客户端发送数据之前检测特定客户端是否已连接。如果客户端未连接,那么我将为该特定用户将数据存储在数据库中。请帮助我提供如何检测特定客户端是否连接的示例代码?谢谢

【问题讨论】:

  • HTTP 是无状态的,所以我认为 SgnalR 持有连接到应用程序的客户端列表。
  • 假设客户端首先连接并在几分钟后关闭他的浏览器窗口。所以我想知道在向他发送一些消息之前检测特定用户是否已连接的方法。分享你的想法....有可能吗。谢谢
  • 链接不是我的答案。我想知道如何从服务器端集线器代码中检测到特定用户是否已连接。

标签: asp.net signalr


【解决方案1】:

我对此有一个建议。在 Chat 类中声明一个 static List 。对OnConnect 事件使用以下代码。

public override Task OnConnected() {
    string connectionId = Context.ConnectionId;
    // Store this connectionId in list -- This will be helpful for tracking list of connected clients.
    return base.OnConnected();
}

并且有OnDisconnect方法。

public override Task OnDisconnected() {
        string connectionId = Context.ConnectionId;
        // Remove this connectionId from list
        // and save the message for disconnected clients.
        // Maintain list of disconnected clients in a list, say ABC
        return base.OnDisconnected();
}

send 方法仅对连接的客户端执行。

public void Send(string message){
        // Call the addMessage method on all clients
        Clients.AllExcept(ABC.ToArray()).addMessage(message);
}

你可以参考这个link

【讨论】:

  • 什么是 ABC.ToArray() ?
  • 连接后,如果用户关闭浏览器或导航到其他站点,是否会触发 OnDisconnected() 函数?如果没有,那么可能有问题。假设用户连接并关闭他的浏览器或导航到其他站点,那么当消息将发送给当时未连接的特定用户时,消息将不会传递给该用户。如何处理这种情况....建议。谢谢
  • 当用户尝试离开具有活动 SignalR 连接的页面时,SignalR 客户端将尽最大努力通知服务器客户端连接将停止。如果 SignalR 客户端的最大努力尝试未能到达服务器,则服务器将在稍后可配置的 DisconnectTimeout 之后释放连接,此时 OnDisconnected 事件将触发。检查此链接 - www.asp.net/signalr/overview/testing-and-debugging/troubleshooting
  • @Thomas ABC.ToArray() 只是对前面代码块注释部分的引用。
  • 当用户关闭浏览器或导航到任何页面时,我们能否显示信号器断开功能的警报。请讨论。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
相关资源
最近更新 更多