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
Web API
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); }
JobInfoRepository
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); }
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
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(); }
Le rendu que j'ai actuellement :
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'); } }); }
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...
Partager