使用信号器与一对一,包括离线模式

时间:2014-02-17 18:10:39

标签: asp.net-mvc-4 signalr

我正在尝试实现从一个客户端到另一个客户端的聊天。在搜索时,我遇到了有趣的SignalR库,用于服务器推送操作。

假设客户端向另一个客户端发送消息,但该客户端此时处于脱机状态。当他回到网上时,他应该看到他在离线时收到消息的通知。 SignalR会将其对话存储在某个地方吗?如何在我的数据库中存储会话?如何让客户端在收到离线消息时看到通知?

有人能为我提供这样的教程吗?我只找到了在线聊天的教程。

亲切的问候

1 个答案:

答案 0 :(得分:11)

SignalR本身不提供离线消息传递。

您必须将脱机消息存储在数据库或某处,并提供逻辑以通知用户有待处理的消息。

天真的实施:

public class ClientHub : Hub
{
    public SendMessage(string message, string targetUserName)
    {
        var userName = Context.User.Identity.Name;
        if (HubHelper.IsConnected(targetUserName))
        {
            Clients.User(targetUserName).sendMessage(message);
        }
        else
        {
            DataAccess.InsertPendingMessage(userName, targetUserName, message);
        }
    }

    public SendPendingMessages()
    {
            // Get pending messages for user and send it
            var meesages = DataAccess.GetPendingMessages(userName);
            Clients.User(userName).processPendingMessages(messages);    
    }

    public override Task OnConnected()
    {
        var connected = base.OnConnected();
        var userName = Context.User.Identity.Name;
        if (!string.IsNullOrWhiteSpace(userName))
        {
            HubHelper.RegisterClient(userName, Context.ConnectionId);
            SendPendingMessages();
        }
        return connected;
    }
}

此代码假定实现以下内容:

  • 客户端功能 sendMessage 以显示私人消息
  • 客户端功能 processPendingMessages 以显示所有待处理的消息
  • DataAccess对象,包含Get( GetPendingMessages )和Insert( InsertPendingMessage )待处理消息的方法。
  • 帮助程序类 HubHelper 以维护内存中的当前客户端连接。