Conserver une valeur dans un WebService

Conserver une valeur dans un WebService - C#/.NET managed - Programmation

Marsh Posté le 12-06-2006 à 15:38:59    

Bonjour,
 
Je voudrais savoir comment faire pour conserver une valeur dans un Webservice et ce quel que soit l'utilisateur.  
J'ai besoin d'une sorte de compteur à chaque fois que je passe dans une procédure.
 
D'avance merci
 
Ben

Reply

Marsh Posté le 12-06-2006 à 15:38:59   

Reply

Marsh Posté le 12-06-2006 à 15:55:41    

Pouurrais-tu préciser sur quelle plateforme tu comptes faire tourner ton webservice ? (Est-ce sous MS-Windows avec IIS ?)

Reply

Marsh Posté le 12-06-2006 à 15:56:53    

oui Win XP avec IIS

Reply

Marsh Posté le 12-06-2006 à 16:21:20    

Tu peux alors définir une classe Global comme par exemple :

Code :
  1. public class Global:System.Web.HttpApplication


dans laquelle tu définis tes propriétés globales et les accesseurs éventuels.
 
Cependant, je dois te mettre en garde car "IIS peut faire le ménage quand il veut" (pas pendant une connexion tout de même) et donc tu risques de perdre les valeurs stockées dans ces propriétés.
 
Si tu dois vraiment conserver ces valeurs sur plusieurs jours d'inutilisation de ton service, je te conseille alors de stocker celles-ci dans une base de données.

Reply

Marsh Posté le 12-06-2006 à 16:56:59    

bb138 a écrit :

Tu peux alors définir une classe Global comme par exemple :
[cpp]"IIS peut faire le ménage quand il veut" (pas pendant une connexion tout de même) et donc tu risques de perdre les valeurs stockées dans ces propriétés.


Pas cool du tout ca!  
Et on peut au moins détecter le fait qu'il a fait le ménage ou pas?  
Si je fait 2 variables: une qui est mon compteur et l'autre qui est un statut. Je mettrai à 1 dès que je détecte qu'il a fait le ménage est ce que je peut etre sur qu'il met en même temps mon statut et mon compteur à 0? Dans ce cas je teste mon statut pour voir si il est à 0 ca signifie qu'il a fait le ménage...
 

Reply

Marsh Posté le 12-06-2006 à 17:15:20    

Pour "t'amuser" avec ta classe global tu as pas mal de méthodes utiles :

Code :
  1. public class Global:System.Web.HttpApplication
  2. {
  3. public Global()
  4. {
  5. }
  6. void Application_Start( object sender, EventArgs e )
  7. {
  8.  // Code qui s'exécute au démarrage de l'application
  9. }
  10. void Application_End( object sender, EventArgs e )
  11. {
  12.  // Code qui s'exécute à la fin de l'application
  13. }
  14. void Application_Error( object sender, EventArgs e )
  15. {
  16.  // Code qui s'exécute lorsque qu'une erreur d'application n'a pas été trappée plus tôt.
  17. }
  18. void Session_Start( object sender, EventArgs e )
  19. {
  20.  // Code qui s'exécute lorsqu'une nouvelle session démarre
  21. }
  22. void Session_End( object sender, EventArgs e )
  23. {
  24.  // Code qui s'exécute lorsqu'une session se termine.  
  25.  // Remarque : l'événement Session_End est déclenché uniquement lorsque le mode sessionstate
  26.  // a la valeur InProc dans le fichier Web.config. Si le mode de session a la valeur StateServer  
  27.  // ou SQLServer, l'événement n'est pas déclenché.
  28. }
  29. }


 
J'espère que ça va t'aider un peu :)

Reply

Marsh Posté le 12-06-2006 à 17:38:28    

Et ca marche avec les WebServices???
Si on joue avec les session, elle se trouve au niveau de l'utilisateur non? Si l'utilisateur se déconnecte est ce que ma valeur sera quand meme sauvée?

Reply

Marsh Posté le 12-06-2006 à 17:57:45    

Dans ton cas, il vaut mieux utiliser Application_xxx et tout devrait aller comme tu le souhaites !

Reply

Marsh Posté le 13-06-2006 à 11:42:18    

the big ben a écrit :

Bonjour,

 

Je voudrais savoir comment faire pour conserver une valeur dans un Webservice et ce quel que soit l'utilisateur.
J'ai besoin d'une sorte de compteur à chaque fois que je passe dans une procédure.

 

D'avance merci

 

Ben


tu peux pas utiliser l'objet Cache ?

Reply

Marsh Posté le 13-06-2006 à 13:16:30    

Y'a plus simple : tu fais une variable static...

Reply

Marsh Posté le 13-06-2006 à 13:16:30   

Reply

Marsh Posté le 13-06-2006 à 21:12:36    

non non non
 
la seule solution c'est de faire un Web Service STATEFULL, bien que ce genre de service ne soit pas préconisé par la norme...
 
L'objectif est donc d'avoir un container ou la variable à conserver serait mis dans une variable de session.  
Du coté client, il faut bien entendu gardé chaque fois la session.  
 
Mais sincèrement ce genre de truc n'est vraiment pas génial. La norme précise bien que les Web Services doivent être STATELESS... Enfin voila, il existe quand même un moyen d'en faire des STATEFULL... J'en ai fais un, c'est pas compliqué, c'est donc jouant sur les variables de session, et un définissant un cookie container coté client.

Reply

Marsh Posté le 14-06-2006 à 11:44:24    

Mouais... mais une variable static c'est quand même bien plus simple.
T'as pas dit pourquoi tu trouves pas ça bien... je veux pas mourir idiot.

Reply

Marsh Posté le 14-06-2006 à 13:15:29    

crois pas que ça marchera avec une variable static. Si ça marchait, tout le monde utiliserait ça. Or personne ne le fait, et passe donc par une variable de Session...  
 
Puis super la variable Static, si ça venait à marcher, tout le monde aurait la même. C'est pas top comme solution, c'est mon avis perso...

Reply

Marsh Posté le 14-06-2006 à 14:04:41    

Ah si si, ça marche. Je t'invite à faire le test :)
 
Ca m'a causé beaucoup de pb par le passé. De très nombreuses heures de débuggage pour se rendre compte que des variables étaient modifiées "toutes seules"... par un autre utilisateur du site ou du Web Service, tout ça à cause d'un pauvre static.
 
Et oui, c'est la même pour tous les utilisateurs, mais il me semble que c'est ce que demandait Ben...

the big ben a écrit :

Je voudrais savoir comment faire pour conserver une valeur dans un Webservice et ce quel que soit l'utilisateur.  
J'ai besoin d'une sorte de compteur à chaque fois que je passe dans une procédure.


 
Pour être précis, les variables statiques sont instanciées dans un tas au niveau processus, donc partagées par tous les threads qui tournent dessus. Et dans des applis web, tu n'as qu'un seul worker (processus) par ApplicationPool dans IIS, donc toutes tes variables statiques sont partagées par les utilisateurs.

Reply

Marsh Posté le 14-06-2006 à 17:16:49    

Je vais tester ca alors (sauf que je suis en Delphi .net donc il va falloir que je trouve comment faire la meme chose)

Reply

Marsh Posté le 14-06-2006 à 17:17:16    

ah ben j'essayerais une fois... dans son cas les variables statiques sont alors tout à fait adéquates...

Reply

Sujets relatifs:

Leave a Replay

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