2011-11-14 10 views
2

J'ai un service WCF s'exécutant sur IIS.Service WCF et singletons

Chaque fois qu'un utilisateur se connecte (avec nom d'utilisateur et mot de passe), je crée une SessionClass qui fait quelque chose toutes les quelques minutes dans un thread et gère les demandes des utilisateurs.

Je sauvegarde chaque nouvelle SessionClass créée dans un dictionnaire dans une classe de service singleton.

Si un utilisateur ne demande rien pendant une longue période (disons 10 heures), la session devrait mourir. Je tue le thread et supprime la SessionClass du dictionnaire dans le singleton ServiceClass. Mon problème est que chaque fois que je supprime une SessionClass du dictionnaire, elle rend l'instance de la classe ServiceClass nulle et la prochaine fois qu'elle est appelée, elle est à nouveau créée, donc je perds toutes les sessions dans lesquelles je tenais le dictionnaire ...

J'ai essayé maintenant référence directe à l'intérieur du service WCF au ServiceClass.GetInstance() (je pensais que le garbage collector est en train de tuer le ServiceClass), mais il ne va pas aider ...

Pourquoi cela arrive-t-il? Des idées? Déclarer votre dictionnaire comme un champ statique.

+0

En savoir plus à ce sujet [ici] (http://msdn.microsoft.com/fr-fr/library/ms731193.aspx). – CodeCaster

Répondre

1

Pour savoir pourquoi cela se passe actuellement, il est impossible de le dire sans plus d'informations, s'il vous plaît envoyer du code.

Mise à jour
fonction de vos commentaires il semble que IIS est Recyling le AppPool et/ou AppDomain. Dans tous les cas, votre AppDomain est déchargé, de sorte que toutes les informations stockées dans la mémoire seront perdues.

Tess Ferrandez a écrit un très bon blog sur pourquoi IIS le fait here

Mise à jour 2
Si c'est simplement gênant que les données sont perdues, vous pouvez essayer l'hébergement de votre service en tant que managed windows service à la place. Le scénario activé par l'option d'hébergement du service Windows géré est celui d'un service WCF de longue durée hébergé en dehors d'IIS dans un environnement sécurisé qui n'est pas activé par message. La durée de vie du service est contrôlée à la place par le système d'exploitation. Si, cependant, il est essentiel que vos données ne soient jamais perdues, vous devrez ajouter un mécanisme de persistance (base de données, stocker dans un fichier sur le disque, etc.) et lire/écrire là-bas.

+0

J'ai déclaré le dictionnaire comme statique mais cela n'a toujours pas aidé. Voici la classe: 'public class ServiceClass { private static ServiceManager _instance; private static Dictionnaire _sessions = new Dictionnaire (); ServiceClass privé() { } ServiceClass public static getInstance() { _instance retour ?? (_instance = new ServiceClass()); } } ' – YogevSitton

+0

hemmm ... ressemble à la raison. J'ai changé les paramètres de recyclage sur l'IIS pour l'AppPool que j'utilise. Est-il possible de s'assurer que l'AppPool ne recyclera jamais?Si non, quelles sont mes options? Comment puis-je m'assurer de ne pas perdre d'informations? – YogevSitton