我正在使用ASP.NET MVC 5和SQL Server 2016在我的应用程序中进行简单的聊天。 在数据库中得到以下表格:
[dbo].[UserMessages](
[Id] [int] IDENTITY(1,1) NOT NULL,
[UserIdSender] [int] NOT NULL,
[UserIdReciever] [int] NOT NULL,
[DateSent] [datetime] NOT NULL,
[MessageText] [nvarchar](max) NULL,
[IsRead] [int] NOT NULL
因此,当一个用户向另一个用户[UserIdReciever]发送消息[UserIdSender]时,第二个用户会在打开聊天选项卡时看到它,因为以下对db的请求将会完成:
public IQueryable<UserMessages> GetDialogByUserIds(int senderId, int recieverId)
{
return _msgRepo.GetAllQueryable(m => (m.UserIdSender == senderId && m.UserIdReciever == recieverId) ||
(m.UserIdSender == recieverId && m.UserIdReciever == senderId));
}
问题是要保持实时聊天,所以当第二个用户首先回答时,第一个用户会立即看到它。所以,我正在考虑是否有办法在更改特定表时在sql中创建特定事件 在sql:
中有类似的东西if(UserMessages.IsChanged())
{
event UserMessagesChanged();
}
或者有没有更好的方法来通知用户传入的消息,每次数据库都不会发送请求,因为有很多用户,每次用户发送消息时都会触发此事件?
答案 0 :(得分:1)
如果您在本地使用SqlServer,您可以尝试使用SqlDependency检测UserMessages表中的更改并在.NET上触发事件来管理聊天更新并将数据推送到浏览器端(使用SocketIO等框架)或SignalR来管理服务器 - 浏览器通信)。 Biblio:
Detecting Changes with SqlDependency
如果您正在使用基于云的体系结构,则需要重新考虑应用程序分层并使用适当的框架(例如,对于Azure,SqlDependency不可用,并且用于检测您可能选择实施的数据更改使用Azure Service Bus发布 - 订阅模式
答案 1 :(得分:0)
在您的情况下,解决它的最佳方法是使用SignalR库。了解什么是Hub以及它是如何工作的。然后将这些行放在您的集线器类中:
public class YourHub : Hub {
public void MessageSender(int userId, string message)
{
//here you need to get the unique connectionId of a user
//just make a query to the database for this
Clients.Client(user.ConnectionId).sendMessage(message)
}
}
然后在客户端:
var hub = $.connection.yourHub;
// Start Hub
$.connection.hub.start().done(function () {
hub.client.sendMessage = function(message){
//here you just append the message for the user
}});