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...