2017-07-26 4 views
1

Nous travaillons en ajoutant une notification push en temps réel à l'application Web Asp.net.Notification push personnalisée avec SignalR et SqlDependency

Je suis capable de diffuser un message à tous les utilisateurs qui sont connectés au site Web.

mais je ne suis pas en mesure d'envoyer une notification à un seul utilisateur en fonction de la valeur insérée dans la table de base de données. Lorsque j'essaie de faire cela, je mets à jour tous les clients qui sont actuellement connectés.

Mon exemple de code ci-dessous:

SqlDependency Composant:

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 

notification Code Hub

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

J'ai également remarqué une chose ici, l'événement sqlDep_OnChange est appelé plus d'une fois si j'ai ouvert l'application dans plus d'un navigateur.

Répondre