IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Accès aux données Discussion :

SignalR et SqlDependency


Sujet :

Accès aux données

  1. #1
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 200
    Points : 111
    Points
    111
    Par défaut SignalR et SqlDependency
    Bonjour à tous,

    J'ai une application ASP.NET MVC 4 et une application console.
    Quand l'application console met à jour des données en base, je souhaiterais que ces informations soient répliquées sur l'interface du site. J'ai décidé d'utiliser SignalR + SqlDependency.
    J'ai des problèmes à le mettre en place...
    J'avais réussi, il y a quelques temps à avoir un fonctionnement qui semblait correct mais je n'arrive plus à refaire fonctionner le bouzin !
    Je me suis basé sur ce site.

    Voici mon code :

    Global.asax
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    protected void Application_Start()
    {
        RouteTable.Routes.MapHubs();
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        SqlDependency.Start(ConfigurationManager.ConnectionStrings["lalala"].ConnectionString);
    }
    protected void Application_End()
    {
        SqlDependency.Stop(ConfigurationManager.ConnectionStrings["lalala"].ConnectionString);
    }
    Web API
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public HttpResponseMessage GetProgression(int countryId)
    {
        JobInfoRepository objRepo = new JobInfoRepository();
        SupplierImportProgression progression = objRepo.GetData(countryId);
        return Request.CreateResponse(HttpStatusCode.OK, progression);
    }
    JobInfoRepository
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
                using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["lalala"].ConnectionString))
                {
                    connection.Open();
     
                    string command = string.Format("{0} {1} {2}",
                                                   "SELECT * FROM table",
                                                   "WHERE CountryId =",
                                                   countryId);
     
                    using (SqlCommand sqlCommand = new SqlCommand(command, connection))
                    {
                        // Make sure the command object does not already have
                        // a notification object associated with it.
                        sqlCommand.Notification = null;
     
                        SqlDependency dependency = new SqlDependency(sqlCommand);
                        //Thread.Sleep(200);
                        dependency.OnChange += dependency_OnChange;
     
                        if (connection.State == ConnectionState.Closed)
                            connection.Open();
     
                        SupplierImportProgression currentImport;
                        using (var reader = sqlCommand.ExecuteReader())
                        {
                            currentImport = new SupplierImportProgression();
                            while (reader.Read())
                            {
                                currentImport.Status = reader["Status"].ToString();
                                currentImport.Progression = (int)reader["Progression"];
                                currentImport.State = reader["State"].ToString();
                                currentImport.Action = reader["Action"].ToString();
                                string succeeded = reader["Succeeded"].ToString();
                                if (!string.IsNullOrEmpty(succeeded))
                                {
                                    currentImport.Succeeded = (bool)reader["Succeeded"];
                                }
                            }
                        }
     
                        return currentImport;
                    }
                }
            }
     
            private static void dependency_OnChange(object sender, SqlNotificationEventArgs e)
            {
                JobHub.Show();
            }
    et dans ma vue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    $(function () {
            // Proxy created on the fly
            var job = $.connection.jobHub;
     
            // Declare a function on the job hub so the server can invoke it
            job.client.displayStatus = function () {
                getProgression();
            };
     
            // Start the connection
            $.connection.hub.start();
            getProgression();
        });
     
    function getProgression() {
            $.ajax({
                url: 'url',
                type: 'GET',
                datatype: 'json',
                success: function (progressionDatas) {
                    console.debug('update');
                }
            });
        }
    Le rendu que j'ai actuellement :
    Lors du chargement de la page je récupère bien les informations, mais dès qu'il y a une mise à jour dans la base : rien...

  2. #2
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 200
    Points : 111
    Points
    111
    Par défaut
    En ayant beaucoup de chance je suis retombé sur un lien où il explique tout à la fin
    Infinite Loop for notification: There may be certain scenarios where your application gets notification as soon as you register. The main cause of this is either you register to a query that does not meet the criteria specified for the Query notification or your application regenerates the notification from inside. Please make sure you don't use * instead of column names and also used dbo.TableName instead of TableName.
    J'ai simplement modifié ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    string command = string.Format("{0} {1} {2}",
                                                   "SELECT element, element FROM table",
                                                   "WHERE CountryId =",
                                                   countryId);
    Donc voilà c'est un truc qui s'invente pas et que j'ai pas compris (si vous avez des explications...) mais ça fonctionne parfaitement maintenant !
    Il est aussi bon de savoir que si je fais une requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    string command = string.Format("{0} {1} {2} {3}",
                                                   "SELECT TOP 1 element, element FROM table",
                                                   "WHERE CountryId =",
                                                   countryId,
                                                   "order by Id desc");
    il n'aime pas non plus...
    Bon maintenant que ça fonctionne, j'ai plus qu'à faire du code un peu plus propre !

    Merci quand même !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 25/11/2013, 15h40
  2. Utilisation de SignalR
    Par DotNET74 dans le forum ASP.NET MVC
    Réponses: 3
    Dernier message: 19/11/2013, 21h55
  3. Exemple ou Tutorial Asp.net SignalR et base de données
    Par aymen8219 dans le forum Développement Web avec .NET
    Réponses: 1
    Dernier message: 26/05/2013, 20h52
  4. Problème avec SqlDependency
    Par nadjibnet dans le forum C#
    Réponses: 1
    Dernier message: 03/02/2013, 13h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo