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

dev*_*qon 5 asp.net-mvc-4 signalr

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

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

任何人都可以为我提供这样的教程吗?我只找到了在线聊天教程.

亲切的问候

the*_*000 12

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 客户端函数sendMessage显示私人消息
  • 客户端函数processPendingMessages显示所有待处理消息
  • DataAccess对象,包含Get(GetPendingMessages)和Insert(InsertPendingMessage)挂起消息的方法.
  • Helper类HubHelper用于维护内存中的当前客户端连接.