【问题标题】:Detect specific conditions database change检测特定条件数据库更改
【发布时间】:2017-08-22 06:16:14
【问题描述】:

我正在使用 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();
}

或者有没有更好的方法来通知用户传入的消息,而不是每次更改数据库时都发送请求,因为有很多用户,并且每次任何用户发送消息时都会触发此事件?

【问题讨论】:

标签: c# sql asp.net sql-server asp.net-mvc


【解决方案1】:

如果您在本地使用 SqlServer,可以尝试使用 SqlDependency 来检测 UserMessages 表中的更改并在 .NET 上触发事件来管理聊天更新并将数据推送到浏览器端(使用 SocketIO 等框架或 SignalR 来管理服务器-浏览器通信)。参考书目:

Detecting Changes with SqlDependency

Socket IO

Learn About ASP.NET SignalR

如果您使用的是基于云的架构,则需要重新考虑应用程序分层并使用适当的框架(例如,对于 Azure,SqlDependency 不可用,并且为了检测数据更改,您可能会选择实施 Publish-使用 Azure 服务总线订阅模式)

【讨论】:

    【解决方案2】:

    在您的情况下,解决它的最佳方法是使用 SignalR 库。了解什么是集线器以及它是如何工作的。然后将这些行放在您的中心类中:


    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
    }});
    

    【讨论】:

      猜你喜欢
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-09
      • 2016-11-19
      • 1970-01-01
      • 1970-01-01
      • 2012-01-27
      相关资源
      最近更新 更多