Signalr: 想在sql server中保存聊天对话但不支持

创建于 2012-12-31  ·  7评论  ·  资料来源: SignalR/SignalR

嗨,大卫,

我已经像facebook聊天一样使用signalR制作了聊天应用程序,现在我想将聊天对话数据保存到数据库中,并想为其对应的聊天室显示该历史记录,请您指导如何存档? signalR 是否支持与 sql server 通信?
另外,您能否指导我如何维护连接 ID,以便我可以像 Facebook 聊天应用程序一样在回发后重新初始化聊天。

Question

最有用的评论

首先,如果您正在寻求帮助,只需说您正在寻求帮助。 您不知道某些事情,这并不意味着 SignalR 不支持它或这是一个问题。

  • 由于您说的是 FB 聊天之类的内容,因此我假设您已经拥有用户登录状态管理(会话中的用户 ID 或 cookie 或其他内容)。
  • 我建议你使用HUB。
  • 用户登录并激活聊天后,您将启动 HUB 连接并获取 SignalR 的连接 ID。
  • 由于您已经拥有连接用户的用户 ID,因此保存 SignalR 的连接 ID 和用户 ID 的映射。 (例如:表结构:user_id、conn_id、updated_date)。
  • 当您收到来自连接 ID 的聊天消息时,您可以轻松查找它来自哪个用户。
  • 然后,使用 userid 保存聊天日志并使用 userid 检索日志。

关键是你不关心 conn id。 你必须用你自己一致的唯一键来映射它。 同样,我建议不要维护 conn id。 最好是随机的。 如果必须维护 conn id,那么您可以覆盖默认的 conn id 生成器。

所有7条评论

首先,如果您正在寻求帮助,只需说您正在寻求帮助。 您不知道某些事情,这并不意味着 SignalR 不支持它或这是一个问题。

  • 由于您说的是 FB 聊天之类的内容,因此我假设您已经拥有用户登录状态管理(会话中的用户 ID 或 cookie 或其他内容)。
  • 我建议你使用HUB。
  • 用户登录并激活聊天后,您将启动 HUB 连接并获取 SignalR 的连接 ID。
  • 由于您已经拥有连接用户的用户 ID,因此保存 SignalR 的连接 ID 和用户 ID 的映射。 (例如:表结构:user_id、conn_id、updated_date)。
  • 当您收到来自连接 ID 的聊天消息时,您可以轻松查找它来自哪个用户。
  • 然后,使用 userid 保存聊天日志并使用 userid 检索日志。

关键是你不关心 conn id。 你必须用你自己一致的唯一键来映射它。 同样,我建议不要维护 conn id。 最好是随机的。 如果必须维护 conn id,那么您可以覆盖默认的 conn id 生成器。

嗨,ZeroHacker,

感谢您的回复,这是否意味着我们可以传递我们自己的连接 ID? 回帖后我们可以继续聊天吗? 我的意思是在将所有细节重新分配到特定房间后,它会继续聊天吗??

  • 我的意思是,一旦用户登录,您就会拥有他/她的用户名,对吗?
  • 因此,您将用户 ID 保存在会话变量中。 例如:在您的应用程序登录页面中,在用户通过身份验证后,将其用户 ID 保存在会话中。 例如:Session["userid"] = "123";
  • 然后,一旦用户连接到聊天,SignalR 将生成一个连接 ID。 也可以将conn id和user id映射保存到数据库中(可选,但对验证和数据挖掘很有用。为了简单起见,我这里就不讲了)

以下是聊天服务器的示例方法:

``` C#
公共覆盖 System.Threading.Tasks.Task OnConnected()
{
// 获取用户 ID。 假设用户在连接聊天之前已登录,并且用户 ID 保存在会话中。
string UserID = (string)HttpContext.Current.Session["userid"];

      // Get ChatHistory and call the client function. See below
      this.GetHistory(UserID); 

      // Get ConnID
      string ConnID =  Context.ConnectionId; 

      // Save them in DB. You got to create a DB class to handle this. (Optional)
      DB.UpdateConnID(UserID, ConnID); 
}

private void GetHistory(UserID)
{
      // Get Chat History from DB. You got to create a DB class to handle this.
      string History = DB.GetChatHistory(UserID); 

      // Send Chat History to Client. You got to create chatHistory handler in Client side.
      Clients.Caller.chatHistory(History );           
}

 // This method is to be called by Client 
public void Chat(string Message)
{
      // Get UserID. Assumed the user is logged before connecting to chat and userid is saved in session.
     string UserID = (string)HttpContext.Current.Session["userid"]; 

     // Save Chat in DB. You got to create a DB class to handle this
     DB.SaveChat(UserID, Message); 

     // Send Chat Message to All connected Clients. You got to create chatMessage handler in Client side.
     Clients.All.chatMessage(Message);  
}

``

注意:我刚刚在这里写下了。 还没有测试。

嗨,ZeroHacker,

再次非常感谢,你有任何粗略的例子吗? 我不希望让它 100% 工作,我只是为了参考目的。
非常感谢

我们可以把它带到 StackOverflow 吗? 这在 SignalR 中不是问题,在 SO 中比在这里受益更多。

@niravpatel我为你写了 3 种方法。 为什么要求更多? 如果您不知道如何保存到 DB,那么您最好去图书馆找一些 C# 书籍。 在询问之前,您应该首先尝试基于它们。 让我们的话题到此结束。

@raybooysen完全同意。

关闭

此页面是否有帮助?
0 / 5 - 0 等级