Afficher les messages SQL récupérés par un WebService dans mon client

Afficher les messages SQL récupérés par un WebService dans mon client - C#/.NET managed - Programmation

Marsh Posté le 17-10-2008 à 20:23:20    

Bonjour,

 

J'essaie de faire un truc un peu compliqué... et je ne suis pas loin du but !

 

J'ai une appli WinForm (C# 2.0) qui va chercher ses données en base SQL Server 2005 via un WebService (C# 2.0). Il n'y a donc pas d'accès direct entre l'appli et la base, le WebService jouant le rôle de proxy.

 

Le but est d'exécuter une procédure stockée et d'afficher dans mon client les messages d'information de la proc stock en temps réel dans mon client.

 

Je suis arrivé à le faire quand mon client est directement connecté à la base (grâce à ce thread : http://www.developpez.net/forums/d [...] mme-csharp)

 

Par contre, avec le WebService au milieu, ça ne fonctionne pas entièrement.
Je me suis beaucoup inspiré de l'article ici :
http://www.codeproject.com/KB/webs [...] vents.aspx

 

--------

 

Au cas où ça pourrait aider, voici mon code.
Partie serveur

Code :
  1. private static string _message;
  2.   /// <summary>
  3.   /// Launches batches
  4.   /// </summary>
  5.   [WebMethod]
  6.   public void Batches_Launcher()
  7.   {
  8.     using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["GAIA"].ConnectionString))
  9.     {
  10.       connection.Open();
  11.       connection.FireInfoMessageEventOnUserErrors = true;
  12.       connection.InfoMessage += new SqlInfoMessageEventHandler(connection_InfoMessage);
  13.       SqlCommand cmd = new SqlCommand("exec dbo.batches_Launcher null, '2008-10-15', '2008-06-30', 1", connection);
  14.       cmd.CommandTimeout = 3600;
  15.       cmd.ExecuteNonQuery();
  16.       connection.Close();
  17.     }
  18.   }
  19.   /// <summary>
  20.   ///
  21.   /// </summary>
  22.   private void connection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
  23.   {
  24.     _message = e.Message;
  25.     _client.GetActiveClientsCompleted.Set();
  26.   }
  27.   /// <summary>
  28.   ///
  29.   /// </summary>
  30.   [WebMethod]
  31.   public string GetMessage()
  32.   {
  33.     _client.GetActiveClientsCompleted.WaitOne();
  34.     return "ok : " + _message;
  35.   }
  36.   private static ClientState _client = new ClientState();
  37.   /// <summary>
  38.   ///
  39.   /// </summary>
  40.   private class ClientState
  41.   {
  42.     public System.Threading.AutoResetEvent GetActiveClientsCompleted = new System.Threading.AutoResetEvent(false);
  43.   }
 

Partie client

Code :
  1. Service service = new Service();
  2.     /// <summary>
  3.     /// Estimates and displays duration
  4.     /// </summary>
  5.     private void EstimateDuration()
  6.     {
  7.       Service service = new Service();
  8.       service.GetMessageCompleted += new GetMessageCompletedEventHandler(service_GetMessageCompleted);
  9.       service.Batches_Launcher();
  10.       service.GetMessageAsync();
  11.     }
  12.     /// <summary>
  13.     ///
  14.     /// </summary>
  15.     void service_GetMessageCompleted(object sender, GetMessageCompletedEventArgs e)
  16.     {
  17.       textBox1.AppendText(e.Result + Environment.NewLine);
  18.       service.GetMessageAsync();
  19.     }


Désolé pour les variables et classe dont vous ne voyez pas la déclaration.
Mais globalement, mon code fonctionne puisque dans mon client le dernier message renvoyé pas SQL s'affiche bien. Mais les messages d'avant qui devraient apparaître les uns après les autres et espacés de qq secondes ne s'affichent pas...

 

Merci bien pour votre aide :)


Message édité par Roodie le 18-10-2008 à 20:14:07
Reply

Marsh Posté le 17-10-2008 à 20:23:20   

Reply

Marsh Posté le 17-10-2008 à 20:58:50    

si j'ai bien compris ce que tu veux faire. je crois que tu as dans ce cas absolument rien compris au fonctionnement des pages ASPX.  
 
Ce n'est pas le serveur (IIS) qui déclenche le raffraichissement, mais le client (le Browser). Si tu travail en mode asynchrone, ça ne va pas bien marcher.  
 
Donc pour moi, le soucie il vient de la. de ta mauvaise compréhension du fonctionnement des pages web ASPX.
 
Bien sûre qu'on me corrige si je me trompe.  
 
Tu as essayé de voir ce que ça donne en debug?


Message édité par moi23372 le 17-10-2008 à 20:59:52

---------------
quand un homme raisonne mal c'est qu'il n'a pas les données pour raisonner mieux (diderot)
Reply

Marsh Posté le 18-10-2008 à 14:29:52    

Faut utiliser un poil d'AJAX pou le refresh c'est tout... ;)
 
Ou alors mettre un Timer et reload la page tout les x temps. Mais là faut testé si on est dans un postback ou pas. Mais ça serait quand meme moche je pense.


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 18-10-2008 à 20:13:42    

Comment ça j'ai rien compris ?  :lol:  
En fait j'ai fait une erreur dans mon message de départ, c'est pas du WebForm mon client mais du WinForm. Pardon :D
 
Et le mode asynchrone fonctionne plutôt bien, sauf dans mon cas un peu compliqué.  
Dans mon code, les 2 parties suivantes fonctionnent bien mais uniquement séparément. Quand je les mets ensemble, ça marche pas bien :  
- le serveur envoie plusieurs réponses asynchrones au client, pour un seul appel du client
- SQL Server envoie les messages périodiquement au serveur
 
AJAX ? C'est pour le WebForm nan ? Moi c'est du WinForm :(

Reply

Marsh Posté le 22-10-2008 à 19:43:56    

Ouf tu m'as fait peur. Si c'est du Winform c'est normal.  
 
Pas normal qu'il t'envoit plusieurs requête. Tu veux dire que tu passes plusieurs fois dans ta méthode "service_GetMessageCompleted"?
 
tu ne fais bien qu'une fois:
Service service = new Service();
      service.GetMessageCompleted += new GetMessageCompletedEventHandler(service_GetMessageCompleted);
 
???


---------------
quand un homme raisonne mal c'est qu'il n'a pas les données pour raisonner mieux (diderot)
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed