使用signalR在sql数据库中存储聊天对话

时间:2015-05-14 14:44:05

标签: sql-server signalr chat messages

我正在开发一个包含这些场景的通用方法的类库:

  • 实时支持聊天(1对1私人文字聊天,有很多管理员和来宾)
  • 有许多用户可以发送广播和私信的房间

以上这两项功能已经实施,现在我的应用程序需要保存邮件。

我的问题是,在SQL数据库中存储聊天对话的最佳方式是什么:

  1. 每次点击发送,我都会在数据库中插入消息?

  2. 为每个用户创建一个列表,每次单击“发送”时,邮件都会保存在发送邮件的用户列表中。然后,如果用户断开连接,我将迭代消息列表,并为每个消息插入数据库中的所有消息。

  3. 还有其他解决方案吗?

    我现在正在做的是以下内容。我有这个方法,它位于我的Hub类:

    public void saveMessagetoDB(string userName, string message)
    {
        var ctx = new TestEntities1();
    
        var msg = new tbl_Conversation {Msg = message};
        ctx.tbl_Conversation.Add(msg); 
        ctx.SaveChanges();           
    }
    

    我在客户端HTML文件中调用此方法saveMessagetoDB,如下所示:

    $('#btnSendMessage').click(function () {
           var msg = $("#txtMessage").val();
    
           if (msg.length > 0) {
    
               var userName = $('#hUserName').val();
               // <<<<<-- ***** Return to Server [  SaveMessagetoDB  ] *****
               objHub.server.saveMessagetoDB(userName, msg);
    

2 个答案:

答案 0 :(得分:1)

如果您决定将聊天记录存储在数据库中,则需要在消息发生时插入/更新消息。

如果您使用的是PersistentConnection,那么您可以挂钩OnReceivedAsync事件并插入/更新该事件的数据:

protected override Task OnConnectedAsync(IRequest request, string connectionId)
{
    _clients.Add(connectionId, string.Empty);
    ChatData chatData = new ChatData("Server", "A new user has joined the room.");
    return Connection.Broadcast(chatData);
}

或者在继承自Hub的SignalR类中,您可以在通知任何客户端之前将其持久保存到Db。

答案 1 :(得分:0)

SignalR非常适合聊天应用程序,除非您想在以后创建聊天记录(甚至可能不需要),否则您甚至不需要在SQL中存储任何内容。

我建议首先使用SignalR进行聊天(不要对sql做任何事情)。然后,一旦工作,您可以根据需要将SQL日志记录放在signalR集线器中。

最有可能在每条消息上写入sql是最有意义的。