我正在开发一个包含这些场景的通用方法的类库:
以上这两项功能已经实施,现在我的应用程序需要保存邮件。
我的问题是,在SQL数据库中存储聊天对话的最佳方式是什么:
每次点击发送,我都会在数据库中插入消息?
为每个用户创建一个列表,每次单击“发送”时,邮件都会保存在发送邮件的用户列表中。然后,如果用户断开连接,我将迭代消息列表,并为每个消息插入数据库中的所有消息。
还有其他解决方案吗?
我现在正在做的是以下内容。我有这个方法,它位于我的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);
答案 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是最有意义的。