使用SignalR和SqlDependency进行个性化推送通知

时间:2017-07-26 15:18:24

标签: asp.net signalr signalr-hub signalr.client sqldependency

我们正在努力向Asp.net网络应用程序添加实时推送通知。

我能够向登录网站的所有用户广播一条消息。

但我无法根据数据库表中插入的值向一个特定用户发送通知。

当我尝试这样做时,它会更新当前登录的所有客户端。

我的代码示例如下:

SqlDependency组件:

Public Sub RegisterNotification(ByVal currentTime As DateTime)
    Try
        Dim conStr = ConfigurationManager.ConnectionStrings("constr").ConnectionString
        Dim sqlCommand = "SELECT [seq_id],[user_id],[create_timestamp],[alert_read] FROM [dbo].[tblAlerts]  WHERE [alert_read]=0 AND [create_timestamp] > @AddedOn"
        Using con As New SqlConnection(conStr)
            Dim cmd As New SqlCommand(sqlCommand, con)
            cmd.Parameters.AddWithValue("@AddedOn", currentTime)

            If con.State <> Data.ConnectionState.Open Then
                con.Open()
            End If
            cmd.Notification = Nothing
            Dim dependency As New SqlDependency(cmd)
            AddHandler dependency.OnChange, AddressOf sqlDep_OnChange
            Using reader As SqlDataReader = cmd.ExecuteReader()
                Do nothing here
            End Using
        End Using
    Catch ex As Exception
        Throw ex
    End Try
End Sub

Sub sqlDep_OnChange(ByVal sender As Object, ByVal e As SqlNotificationEventArgs)
    Try
        If e.Info = SqlNotificationInfo.Insert Then
            Dim notificationHub = GlobalHost.ConnectionManager.GetHubContext(Of NotificationHub)
            Dim userid = Membership.GetUser.ProviderUserKey
            notificationHub.Clients.All.notify(userid)
        End If
        Dim depend = DirectCast(sender, SqlDependency)
        RemoveHandler depend.OnChange, AddressOf sqlDep_OnChange
        RegisterNotification(DateTime.UtcNow)
    Catch ex As Exception

    End Try
End Sub

通知中心代码

Public Class NotificationHub
    Inherits Hub

    Public Sub showdata(ByVal obj As Object)
        Try
            Dim userobj = obj
            Dim notificationHub = GlobalHost.ConnectionManager.GetHubContext(Of NotificationHub)
            Dim count = 0
            take count from database for userid in the object
            notificationHub.Clients.All.setcount(count)
        Catch ex As Exception

        End Try
    End Sub

End Class

SignalR Js代码

$(function () {

        // signalr js code for start hub and send receive notification
        var notificationHub = $.connection.notificationHub;

        notificationHub.client.setCount = function (data) {
            $('span.count').html(data);
        }                     

        $.connection.hub.start().done(function () {
            console.log('Notification hub started');
        });
        //signalr method for push server message to client
        notificationHub.client.notify = function (message) {
            if (message) {
                notificationHub.server.showdata(message);
            }
        }
    })

我还注意到,如果我在多个浏览器中打开了应用程序,则会多次调用sqlDep_OnChange事件。

1 个答案:

答案 0 :(得分:0)

我已设法通过以下链接执行相同操作: https://docs.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/mapping-users-to-connections

使用SignalR v2,您可以使用connectionID查找相应的用户。