Notifications SignalR dans ASP.NET MVC avec SQL Dependency


signalrlogo

Dans cet article, je vais expliquer comment afficher en temps réel les notifications de changement de base de données SQL Server en utilisant SignalR et SqlDependency.

Concrètement, la base de données peut être mise à jour ou synchronisée par un service Windows en arrière-plan, notre besoin est d’afficher les données mises à jour en temps réel. La suite de cet article vous montrera comment mettre en œuvre ce mécanisme dans une application ASP .Net MVC.

 

 

SignalR ?

En bref, SignalR est une bibliothèque client/serveur qui permet d’ajouter des fonctionnalités temps-réel. Elle se base sur les Websockets qui assurent le polling client moyennant un canal bidirectionnel et fullduplex entre le client et le serveur. Cette bibliothèque va masquer la complexité de la gestion des appels JavaScripts au serveur.

Hub?

Un Hub est une classe de SignalR côté serveur. Elle va se charger de gérer des appels entre clients et le serveur dans les deux sens.

SQL Dependency ?

Il existe 3 manières de gérer les notifications SQL dans les applications .Net :

  1. SqllNotificationRequest : gérer les notifications bas niveau : en plus d’activer le « Service Broker », il faut créer des QUEUE et des SERVICE dans la base de données
  2. SqlDependency : faire abstraction de la complexité bas niveau des fonctionnalités de notification et permet de détecter facilement les modifications qui sont faites sur la base de données ;
  3. SqlCacheDependency : utiliser implicitement un SqlDependency pour tout ce qui concerne la gestion de cache dans les applications ASP.NET.

Service Broker ?

Le Service Broker est un service qui permet l’activation des notifications de requêtes SQL. Il permet aussi la communication entre des instances SQL Server efficacement et sûrement.

Implémentation

Passons à la pratique : pour faire simple, je vais interroger directement la base de données depuis la classe Repository dans une application ASP .NET MVC, suivons les étapes suivantes :

  1.  Configuration de la base de données:
    Tout d’abord, vérifiez si le service broker est activé ou pas sur la base de données.

    Si le service n’est pas activé, activez le avec la commande suivante :

    Reste à créer la table Messages dans la base de données:
  2. Définition de la chaîne de connexion dans le fichier de configuration web.config :
  3. Installation SignalR depuis Nuget : Ouvrez la console du Package Manager et exécutez la commande suivante:
  4. Configuration SqlDependency :
    • Activer le listener au moment de l’initialisation de l’application et l’arrêter à la fin dans le fichier Global.asax.cs :
    • Ajoutez la classe Model « Message »
    • et la classe Repository pour obtenir les changements de données de la base SQL :

      Vous avez bien remarqué l’utilisation de la classe MessageHub, je vais vous donner dans la suite son implémentation.
  5. Création de la class Hub:
  6. Enregistrer SignalR dans la classe de démarrage
  7. Ajouter une action dans le controller qui permet de mettre à jour la vue quand les données
  8. Ajouter les scripts SignalR dans la vue : dans notre exemple, nous allons créer une fonction GetMessages qui permet de retourner les données mises à jour et les afficher dans une table dans la vue principale

    La vue Principale contient simplement une division pour afficher le résultat contenu dans une PartialView qu’on verra dans la suite :
  9. Création de la vue partielle UpdatedMessagesList:

Avec ces modifications, lorsque les données sont ajoutées, modifiées ou supprimées dans la table Messages, la méthode DependencyOnChange dans la classe Repository se déclenche.
Vous savez maintenant comment abonner une applications ASP .NET MVC à une base de données, de synchroniser vos données et de rafraîchir automatiquement les vues côté client.

1 commentaire(s)

  • Bel article, super instructif.
    J’ai repris votre cours, hélas mon application n’a pas pu tourner.
    Le message d’erreur est survenu au niveau de la classe Repository.cs plus précisément la variable ” var reader = command.ExecuteReader();” qui ne gère pas une exception.
    Que faire??
    Au besoin merci de bien vouloir nous laisser votre code source.

    Reply

Commentez cet article